打印

C++析构函数问题

[复制链接]
1199|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sinadz|  楼主 | 2012-7-8 22:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下,为了说明问题只给出关键部分
class A {
int *p;
~A() {delete [] p};
A() {p = new int[100];}
};
class B {
A a;
B(A e) {a = e;}
};
在程序退出的时候,会出现异常,然后exception指向A的析构函数~A()那一行。(vs2010环境)
然后我不得不点击abort终止程序。
但是当我修改class B如下
class B {
A *a;
B(A *e) {a = e;}
};
程序退出时就没有异常发生了。即A的析构函数~A()被顺利执行了。
按照类的销毁顺序,是先B后A,为什么第一种情况不能正常的销毁A呢?
换句话说,为什么在B类中定义A或A的指针,在程序退出时会有这种区别呢?

相关帖子

沙发
无冕之王| | 2012-7-8 22:51 | 只看该作者
第一种情况:a = e;会发生浅拷贝。然后e中指针p的值会给a中的p。那么他们两个指针变量共享一份内存。当程序结束的时候,这两个对象都要调用A的析构函数,导致了一份内存多次delete。出现你说的问题。
第二种情况:B中是A的指针变量,B析构的时候不会调用A的析构函数,那么就不会出现一份内存多次delete的情况了

使用特权

评论回复
板凳
hsbjb| | 2012-7-8 22:59 | 只看该作者
构造函数和析构函数的顺序没有要求吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

304

主题

2313

帖子

0

粉丝