回 帖 发 新 帖 刷新版面

主题:急切求解决!!!!!!!!

delete 和new 问题
MFC对话框类中定义2个结构体 并定义     f* fda[2]; h* fgd;

 h* fgd;typedef struct tagf
{
    char m;
    char n;
    char cstr;
}f;
typedef struct tagh
{
    char j;
    f* sdf;
}h;
接下来在类的构造函数中如下
     f* fda=new f[2];
     h* fgd=new h;
    fgd->sdf=fda;
    fgd->j='a';
    fgd->sdf[0].m='a';
    fgd->sdf[0].n='a';
    fgd->sdf[0].cstr='a';
    fgd->sdf[1].m='a';
    fgd->sdf[1].n='a';
    fgd->sdf[1].cstr='a'
在类的析构函数中如下
    delete [] fda;
    delete fgd;
编译通过,但运行却发生错误
调试的结果是
MyProjectCE.exe 中的 0x0041a65b 处未处理的异常: 0xC0000005: 读取位置 0xccccccd0 时发生访问冲突
析构函数什么都不写的话就没错,这都为什么啊,怎么解决?
求高人说下...谢谢

回复列表 (共2个回复)

沙发

1.函数体本身没有任何错误。

**************************************************************************
2.错误原因:
    MFC对话框类中定义2个结构体 并定义 
    
    f* fda[2];
    h* fgd;

之后,又在构造函数中使用的下面语句:

     f* fda=new f[2];
     h* fgd=new h;

是不同的指针,一个的作用域是对话框类,第二个的作用域确是构造函数内。虽然编译器没有报错,但

是析构时确是试图释放全局对话框类的f、h指针,事实上他们根本没有分配任何堆空间,自然会报错。

*****************************************************************************
3.解决方法:

将  f* fda[2];
    h* fgd;
改为: f* fda;




板凳

(按错了,提交了?!!)


     f* fda=new f[2];
     h* fgd=new h;

改为:
     fda=new f[2];
     fgd=new h;

*********************************************************************************
4.一点建议:

   尽量不要用十分晦涩的[单词]来表示变量。你可以用MyNode1,MyNode2之类单词来表示,这样可读性

就会好点。特别在以后代码很多的时候,不管是什么原因,没有人会有耐心看可读性很差的代码。


我来回复

您尚未登录,请登录后再回复。点此登录或注册