VC 中的 delete 问题:什么条件下会出错?
定义的类:class HEXFile
{
protected:
volatile HANDLE _handleFile; // 文件句柄
unsigned char * data ; // 数据指针.
long start, end; // 缓冲区有用数据起始位置和结束位置
long size; // 数据缓冲区长度.
public:
HEXFile()
{
;
}
~HEXFile()
{
;
}
void delHEXFile()
{
if( data ) delete [] data;
size =0 ;
}
void setHEXFile( long buffersize, long value = 0xff )
{
if( data ) {delete [] data;} //???为什么执行有错误???
if( buffersize <= 0 )
AfxMessageBox( "Cannot have zero-size HEX buffer!" );
data = new unsigned char[ buffersize ];
if( !data )
AfxMessageBox( "Memory allocation failed for HEX-line-buffer!" );
size = buffersize;
}
};
界面:
1http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_210415.JPG
//执行下面这个测试按钮会出错
void CTestDlg::OnOK()
{
// TODO: Add extra validation here
hexf.setHEXFile( 2048, 0xff );
//CDialog::OnOK();
}
出错:
1http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_210417.JPG
工程文件:
点击此处下载ourdev_210418.rar(文件大小:18K)
有人知道是什么问题吗? class HEXFile
{
protected:
volatile HANDLE _handleFile; // 文件句柄
unsigned char * data ; // 数据指针.
long start, end; // 缓冲区有用数据起始位置和结束位置
long size; // 数据缓冲区长度.
public:
HEXFile()
{
data=NULL;
}
~HEXFile()
{
if( data ) delete [] data;
}
void delHEXFile()
{
if( data ) delete [] data;
size =0 ;
}
void setHEXFile( long buffersize, long value = 0xff )
{
if( data ) {delete [] data;} //???为什么执行有错误???
if( buffersize <= 0 )
AfxMessageBox( "Cannot have zero-size HEX buffer!" );
data = new unsigned char[ buffersize ];
if( !data )
AfxMessageBox( "Memory allocation failed for HEX-line-buffer!" );
size = buffersize;
}
};
#endif
/* end of file */ HEXFile() 中把指针初始化。
~HEXFile()中把内存释放,不然会内存泄露的。
另外,windows编程,VC问题可以上csdn,那儿人比较多。 if( data ) {delete [] data;}==> if(size) {delete [] data;} 这个是一般的c++问题,找本书好好看下. 问题出在 delete 之后没有把 data赋为空!! delete[] data; data = NULL; 就OK了. 其实 if(data)条件是不用加的.
delete 空指针是合法的, 不会出错. 现在回头看看,1楼是正解。在构造函数里要对成员变量进行初始化 今天发现我的问题有人回答。
2楼】 j805 寄存器
积分:238
派别:
等级:------
来自:中国-上海
HEXFile() 中把指针初始化。
~HEXFile()中把内存释放,不然会内存泄露的。
另外,windows编程,VC问题可以上csdn,那儿人比较多。
__________________________
不是这里的问题
主要为了说明我所问的问题,才删掉了构造和析构的内容 【3楼】 jimo
积分:1901
派别:
等级:------
来自:人在路途
if( data ) {delete [] data;}==> if(size) {delete [] data;}
__________________________
这是推测吧。
size 和 data 关系是人为的,你怎么知道 size 为 0 data 就是空的?size 不为 0 data 就是非空的? 【4楼】 lixun00 音乐虫子
积分:530
派别:
等级:------
来自:
这个是一般的c++问题,找本书好好看下.
-------------------------------------------------
看了几本,愚钝,没找到答案。 【5楼】 nicksean 不务正业
积分:163
派别:
等级:------
来自:沈阳
问题出在 delete 之后没有把 data赋为空!! delete[] data; data = NULL; 就OK了. 其实 if(data)条件是不用加的.
delete 空指针是合法的, 不会出错.
---------------------------------------------------
真的么? data = NULL; 在出错的地方后面。 【6楼】 jimo
积分:1901
派别:
等级:------
来自:人在路途
现在回头看看,1楼是正解。在构造函数里要对成员变量进行初始化
__________________________
ok,解决了。./emotion/em025.gif 你程序报的是调试断言错误,错误信息已经给出了断言定义的位置,过去看一下就可以,具体怎么定义的错误。
/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
_ASSERTE(_CrtIsValidHeapPointer(pUserData));
我认为2楼的回答是正解。 嗯
页:
[1]