定位new和显式析构

小弟我看的是第3版P579 :

char *arena = new char[sizeof Image];

Image *ptr = new (arena) Image("Quasimodo");

Image *ptr = new (arena) Image("Esmerelda");

我 的问题是在覆盖Quasimodo的图像前书中说要调用ptr->~Image();而不是delete ptr;因为那样会删除底层储存区。。我觉得ptr->~Image()中不也调用了delete ptr吗?  还有个小问题就是为什么不能直接覆盖?我看string类的复制构造函数里也经常有这一步是不是用new分配动态内存是要确保左面的内存区 域是一块未初始化的区域??谢谢大家!(大概我的问题在很多人眼里很弱智我还是硬着头皮问拉,哈哈)
==================================================

我的理解:
1。你使用的是placement new,不分配内存,而是在指定内存位置上构造对象
new()起到定位的作用
后面Image()起到构造建立对象的作用
2。你在相同的位置想创建另一个对象,则需先析构原来那个对象
这样理解:从数据的角度讲,你完全可以不析构原来的对象a,直接在那个位置上构造新对象b,这样做的问题是什么呢,系统认为你的a对象还存在(事实上已经被b对象覆盖了),所以a.fun()之类的使用仍可以进行,但数据却成b的了,这当然错了。
所以从这个角度上,我个人的理解,析构函数是通知系统,这个对象的生命期结束,否则系统一直认为对象有效
3。 delete的问题,由于你的用来构造对象的内存是从堆空间申请的,所以需手动释放,delete释放之后,你的对象b仍使用arena那个指针所指的内 存的话,会出什么问题呢,系统认为那块内存已经是自由的了(因为delete通知了),所以并不维护那块内存的数据,可能分配给其他申请的地方,这样,你 在那块内存上构造的对象b的数据同样被破坏了。
所以,简化的话,你可以使用栈空间char sz[sizeof(Image)];这样就不允许使用delete,而这块内存的管理系统进行,无需你的手动的管理了 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值