{
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 []
要配对使用啊。
delete RecordDataASCII;
修改为
delete [] RecordDataASCII;
new / delete
new [] / delete []
要配对使用啊。
#4
new [],这称为array new,申请的是数组,new []会把数组大小保存起来。
当调用delete []时,编译器才会去取出这个数组的大小,然后每一个对象都delete。
如果用delete,就只会析构一个对象,释放一个对象大小的内存,剩余的就泄漏了。
这是c++的基础知识了。
当调用delete []时,编译器才会去取出这个数组的大小,然后每一个对象都delete。
如果用delete,就只会析构一个对象,释放一个对象大小的内存,剩余的就泄漏了。
这是c++的基础知识了。
#5
delete []吧
#6
ls说的非也,对于VS编译器,如果new的是基本类型,则可以不带[];如果是非基本类型,则必须要加上,特别是类时,因为不仅仅释放内存,还要走类的析构函数
#7
RecordDataASCII = NULL;
delete RecordDataASCII;
????先赋值为空,再对这个空指针进行释放?!!!
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 []
要配对使用啊。
delete RecordDataASCII;
修改为
delete [] RecordDataASCII;
new / delete
new [] / delete []
要配对使用啊。
#4
new [],这称为array new,申请的是数组,new []会把数组大小保存起来。
当调用delete []时,编译器才会去取出这个数组的大小,然后每一个对象都delete。
如果用delete,就只会析构一个对象,释放一个对象大小的内存,剩余的就泄漏了。
这是c++的基础知识了。
当调用delete []时,编译器才会去取出这个数组的大小,然后每一个对象都delete。
如果用delete,就只会析构一个对象,释放一个对象大小的内存,剩余的就泄漏了。
这是c++的基础知识了。
#5
delete []吧
#6
ls说的非也,对于VS编译器,如果new的是基本类型,则可以不带[];如果是非基本类型,则必须要加上,特别是类时,因为不仅仅释放内存,还要走类的析构函数
#7
RecordDataASCII = NULL;
delete RecordDataASCII;
????先赋值为空,再对这个空指针进行释放?!!!
delete RecordDataASCII;
????先赋值为空,再对这个空指针进行释放?!!!
#8
关于RecordDataASCII是否泄漏
你试试开一个大一些的固定大小的数组
如果问题解决了就是这里释放有问题
如果没解决就是文件句柄释放的问题
你试试开一个大一些的固定大小的数组
如果问题解决了就是这里释放有问题
如果没解决就是文件句柄释放的问题
#9
顺序搞反了。先释放,再赋值为NULL
#10
是的,顺序反了,应该先释放,在置空。