定位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,而这块内存的管理系统进行,无需你的手动的管理了 

你可能感兴趣的:(image,String,delete)