none
MFC资源释放问题 RRS feed

  • 问题

  • MFC中以什么形式定义的变量或者结构等需要释放资源,哪些不需要?比如CFile f_file;char FileData[8];SYSTEMTIME sysTime;CEdit* pDispalyCount;这些是否需要释放资源?如何释放?

    bool CWinCE_PingDlg::CreateDataFile(CString FileName,CString FileData)
    {
    	SYSTEMTIME sysTime;
    	GetLocalTime(&sysTime);
    	CString FileCreateTime;
    	FileCreateTime.Format(L"\\ResidentFlash2\\WinCE_Ping\\%4d%02d%02d",sysTime.wYear,sysTime.wMonth,sysTime.wDay);
    	CString f_RecordFileName = (CString)FileCreateTime + FileName;
    	//char RecordTime[8];
    	//sprintf_s(RecordTime,"%2d:%2d:%2d",sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
    	CString RecordData = FileData;
    	int DataLength = WideCharToMultiByte(CP_OEMCP,NULL,RecordData,-1,NULL,0,NULL,FALSE);
    	char *RecordDataASCII = new char[DataLength];
    	WideCharToMultiByte(CP_OEMCP,NULL,RecordData,-1,RecordDataASCII,DataLength,NULL,FALSE);
    	try
    	{
    		CFileException e;
    		CFile f_Record;
    		f_Record.Open(f_RecordFileName,CFile::modeCreate | CFile::modeReadWrite + CFile::shareDenyRead,&e);
    		f_Record.SeekToBegin();
    		f_Record.Write(RecordDataASCII,DataLength-1);
    		f_Record.Close();
    	}
    	catch(CFileException e)
    	{
    		RecordDataASCII = NULL;
    		delete RecordDataASCII;
    		return false;
    	}
    	RecordDataASCII = NULL;
    	delete RecordDataASCII;
    
    	return true;
    }

    屏蔽这段代码,程序正常,内存使用也正常,但是加上这段,程序使用内存一直增加。这段代码用于记录数据到一个文件中。FileName为文件名,FileData为需要记录的数据。麻烦帮我看一下那个地方的资源没有释放,谢谢!

    • 已编辑 GT_MDRG 2013年12月28日 3:44 找到问题代码段了
    2013年12月26日 9:20

答案

  • 你好,

    C++中的资源管理问题总的原则是,你自己new的,一定要自己delete掉。对于像类似这样定义的变量,当它超出它的作用域后,它会自动被销毁掉,不需要我们释放。

    {
       const int BUFF_SIZE = 128;

       // Allocate on the frame 
       char myCharArray[BUFF_SIZE];
       int myIntArray[BUFF_SIZE];
       // Reclaimed when exiting scope
    }

    像以下这样的情况,就是我们自己new的,就一定要我们delete。

    const int BUFF_SIZE = 128;
    
    // Allocate on the heap 
    char* myCharArray = new char[BUFF_SIZE]; 
    int* myIntArray = new int[BUFF_SIZE];
    
    delete [] myCharArray;
    delete [] myIntArray;

    对于MFC,有些资源的分配和释放是有函数可以帮我们做的,我们要记得使用相对应的函数去分配资源和释放资源,一般这样的函数在使用时记得要成对使用,分配+释放。以下链接中列出了一些常涉及的MFC分配和释放函数,供你参考。

    http://blog.csdn.net/believefym/article/details/1375003

    其次,可能了解C++的堆内存管理会帮助你更深入的了解内存分配相关内容。以下链接帮助你深入学习。

    http://msdn.microsoft.com/en-us/library/123by34a.aspx

    希望对你有帮助!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 GT_MDRG 2014年1月3日 8:22
    2013年12月27日 6:48

全部回复

  • 我敢肯定的说 char FileData[8];SYSTEMTIME sysTime, 不用管资源释放问题。

    CFile Open 后,一定要 Close。

    CEdit * pDispalyCount 不好说,如果是 new 的,就需要 delete.


    话说回来,你应该先学会 C++,你问的问题都好奇怪。
    • 已编辑 Skyseer 2013年12月26日 9:38
    2013年12月26日 9:37
  • 你好,

    C++中的资源管理问题总的原则是,你自己new的,一定要自己delete掉。对于像类似这样定义的变量,当它超出它的作用域后,它会自动被销毁掉,不需要我们释放。

    {
       const int BUFF_SIZE = 128;

       // Allocate on the frame 
       char myCharArray[BUFF_SIZE];
       int myIntArray[BUFF_SIZE];
       // Reclaimed when exiting scope
    }

    像以下这样的情况,就是我们自己new的,就一定要我们delete。

    const int BUFF_SIZE = 128;
    
    // Allocate on the heap 
    char* myCharArray = new char[BUFF_SIZE]; 
    int* myIntArray = new int[BUFF_SIZE];
    
    delete [] myCharArray;
    delete [] myIntArray;

    对于MFC,有些资源的分配和释放是有函数可以帮我们做的,我们要记得使用相对应的函数去分配资源和释放资源,一般这样的函数在使用时记得要成对使用,分配+释放。以下链接中列出了一些常涉及的MFC分配和释放函数,供你参考。

    http://blog.csdn.net/believefym/article/details/1375003

    其次,可能了解C++的堆内存管理会帮助你更深入的了解内存分配相关内容。以下链接帮助你深入学习。

    http://msdn.microsoft.com/en-us/library/123by34a.aspx

    希望对你有帮助!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 GT_MDRG 2014年1月3日 8:22
    2013年12月27日 6:48