class A{ int i; }; class B{ A *p; public: B(){p=new A;} ~B(){delete p;} };

原文:https://blog.csdn.net/weixin_34198453/article/details/85790853

1.程序执行结果:崩溃

class A{
   int i;
};
class B{
   A *p;
public:
   B(){p=new A;}
   ~B(){delete p;}
};
void sayHello(B b){
}
int main(){
   B b;
   sayHello(b);
}

原因:

调用sayHello() 传入 b 的时候,调用了默认拷贝构造函数。默认拷贝构造函数执行的是浅拷贝操作。直接把b对象中成员p的指针赋值给了新的对象。当执行完sayHello之后,新的对象析构 delete 了 原来的p。随后结束程序前 析构了旧的对象。又一次调用了delete p。两次delete p,就会崩溃了

C/C++开了一个特例:如果main函数没有返回值,那么相当于返回0。仅仅main函数如此

双重delete,这是undefined behaviour,什么事情都可以发生。可以崩溃,可以机器冒烟,恶魔可以从程序员或者用户的鼻子里冒出来,你家的猫会怀孕,或者什么事都不发生,或者程序死循环,都可以。

sayHello的问题,参数B默认拷贝构造是浅拷贝,导致析构了两次,崩了

嗯,是这样,但是析构两次的结果是undefined behaviour,不一定崩溃。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值