helloshi 发表于 2008-2-2 09:59:17

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)

有人知道是什么问题吗?

j805 发表于 2008-3-30 22:00:13

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 */

j805 发表于 2008-3-30 22:02:31

HEXFile() 中把指针初始化。

~HEXFile()中把内存释放,不然会内存泄露的。


另外,windows编程,VC问题可以上csdn,那儿人比较多。

jimo 发表于 2008-4-25 00:39:54

if( data ) {delete [] data;}==> if(size) {delete [] data;}

lixun00 发表于 2008-6-12 03:17:29

这个是一般的c++问题,找本书好好看下.

nicksean 发表于 2008-6-13 14:31:21

问题出在 delete 之后没有把 data赋为空!!   delete[] data; data = NULL; 就OK了. 其实 if(data)条件是不用加的.
delete 空指针是合法的, 不会出错.

jimo 发表于 2008-7-2 21:59:44

现在回头看看,1楼是正解。在构造函数里要对成员变量进行初始化

helloshi 发表于 2009-6-10 11:35:35

今天发现我的问题有人回答。

2楼】 j805 寄存器
积分:238
派别:
等级:------
来自:中国-上海
HEXFile() 中把指针初始化。

~HEXFile()中把内存释放,不然会内存泄露的。


另外,windows编程,VC问题可以上csdn,那儿人比较多。

__________________________
不是这里的问题
主要为了说明我所问的问题,才删掉了构造和析构的内容

helloshi 发表于 2009-6-10 11:40:00

【3楼】 jimo

积分:1901
派别:
等级:------
来自:人在路途
if( data ) {delete [] data;}==> if(size) {delete [] data;}
__________________________

这是推测吧。

size 和 data 关系是人为的,你怎么知道 size 为 0 data 就是空的?size 不为 0 data 就是非空的?

helloshi 发表于 2009-6-10 11:41:11

【4楼】 lixun00 音乐虫子
积分:530
派别:
等级:------
来自:
这个是一般的c++问题,找本书好好看下.
-------------------------------------------------

 
看了几本,愚钝,没找到答案。

helloshi 发表于 2009-6-10 11:43:13

【5楼】 nicksean 不务正业
积分:163
派别:
等级:------
来自:沈阳
问题出在 delete 之后没有把 data赋为空!!   delete[] data; data = NULL; 就OK了. 其实 if(data)条件是不用加的.
delete 空指针是合法的, 不会出错.   
 
---------------------------------------------------
真的么? data = NULL; 在出错的地方后面。

helloshi 发表于 2009-6-10 11:45:51

【6楼】 jimo

积分:1901
派别:
等级:------
来自:人在路途
现在回头看看,1楼是正解。在构造函数里要对成员变量进行初始化
__________________________

ok,解决了。./emotion/em025.gif

Appcat 发表于 2009-6-10 11:53:41

你程序报的是调试断言错误,错误信息已经给出了断言定义的位置,过去看一下就可以,具体怎么定义的错误。


         /*
         * 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楼的回答是正解。

helloshi 发表于 2009-6-10 12:08:04

页: [1]
查看完整版本: VC 中的 delete 问题:什么条件下会出错?