搜索
bottom↓
回复: 13

VC 中的 delete 问题:什么条件下会出错?

[复制链接]

出0入0汤圆

发表于 2008-2-2 09:59:17 | 显示全部楼层 |阅读模式
定义的类:
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;
               
        }
       
       
};
界面:
1

//执行下面这个测试按钮会出错
void CTestDlg::OnOK()
{
        // TODO: Add extra validation here
        hexf.setHEXFile( 2048, 0xff );       

        //CDialog::OnOK();
}
出错:
1

工程文件:
点击此处下载ourdev_210418.rar(文件大小:18K)

有人知道是什么问题吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 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 */

出0入0汤圆

发表于 2008-3-30 22:02:31 | 显示全部楼层
HEXFile() 中把指针初始化。

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


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

出0入0汤圆

发表于 2008-4-25 00:39:54 | 显示全部楼层
if( data ) {delete [] data;}  ==> if(size) {delete [] data;}

出0入0汤圆

发表于 2008-6-12 03:17:29 | 显示全部楼层
这个是一般的c++问题,找本书好好看下.

出0入0汤圆

发表于 2008-6-13 14:31:21 | 显示全部楼层
问题出在 delete 之后没有把 data赋为空!!   delete[] data; data = NULL; 就OK了. 其实 if(data)条件是不用加的.
delete 空指针是合法的, 不会出错.

出0入0汤圆

发表于 2008-7-2 21:59:44 | 显示全部楼层
现在回头看看,1楼是正解。在构造函数里要对成员变量进行初始化

出0入0汤圆

 楼主| 发表于 2009-6-10 11:35:35 | 显示全部楼层
今天发现我的问题有人回答。

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

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


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

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

出0入0汤圆

 楼主| 发表于 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 就是非空的?

出0入0汤圆

 楼主| 发表于 2009-6-10 11:41:11 | 显示全部楼层
【4楼】 lixun00 音乐虫子
积分:530
派别:
等级:------
来自:
这个是一般的c++问题,找本书好好看下.  
-------------------------------------------------

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2009-6-10 11:45:51 | 显示全部楼层
【6楼】 jimo

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

ok,解决了。

出1070入962汤圆

发表于 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楼的回答是正解。

出0入0汤圆

 楼主| 发表于 2009-6-10 12:08:04 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 16:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表