MFC资源释放问题

时间:2022-09-11 19:13:19
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;
}

10 个解决方案

#1


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

#2


是不是delete RecordDataASCII; 要改成  delete []RecordDataASCII; ->> 不同的编译器要求可能不一样的,有的编译器不管new的数据类型是否是基本类型,都要加上[]

#3


很明显要把
delete RecordDataASCII;
修改为
delete [] RecordDataASCII;

new / delete
new [] / delete []

要配对使用啊。

#4


new [],这称为array new,申请的是数组,new []会把数组大小保存起来。
当调用delete []时,编译器才会去取出这个数组的大小,然后每一个对象都delete。
如果用delete,就只会析构一个对象,释放一个对象大小的内存,剩余的就泄漏了。
这是c++的基础知识了。

#5


delete []吧

#6


ls说的非也,对于VS编译器,如果new的是基本类型,则可以不带[];如果是非基本类型,则必须要加上,特别是类时,因为不仅仅释放内存,还要走类的析构函数

#7


RecordDataASCII = NULL;
delete RecordDataASCII;


????先赋值为空,再对这个空指针进行释放?!!!

#8


关于RecordDataASCII是否泄漏
你试试开一个大一些的固定大小的数组
如果问题解决了就是这里释放有问题
如果没解决就是文件句柄释放的问题

#9


顺序搞反了。先释放,再赋值为NULL

#10


是的,顺序反了,应该先释放,在置空。

#1


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

#2


是不是delete RecordDataASCII; 要改成  delete []RecordDataASCII; ->> 不同的编译器要求可能不一样的,有的编译器不管new的数据类型是否是基本类型,都要加上[]

#3


很明显要把
delete RecordDataASCII;
修改为
delete [] RecordDataASCII;

new / delete
new [] / delete []

要配对使用啊。

#4


new [],这称为array new,申请的是数组,new []会把数组大小保存起来。
当调用delete []时,编译器才会去取出这个数组的大小,然后每一个对象都delete。
如果用delete,就只会析构一个对象,释放一个对象大小的内存,剩余的就泄漏了。
这是c++的基础知识了。

#5


delete []吧

#6


ls说的非也,对于VS编译器,如果new的是基本类型,则可以不带[];如果是非基本类型,则必须要加上,特别是类时,因为不仅仅释放内存,还要走类的析构函数

#7


RecordDataASCII = NULL;
delete RecordDataASCII;


????先赋值为空,再对这个空指针进行释放?!!!

#8


关于RecordDataASCII是否泄漏
你试试开一个大一些的固定大小的数组
如果问题解决了就是这里释放有问题
如果没解决就是文件句柄释放的问题

#9


顺序搞反了。先释放,再赋值为NULL

#10


是的,顺序反了,应该先释放,在置空。