[问题] C++ primer 4/e中文版 p.496

楼主: ko27tye (好滋好滋)   2016-05-28 02:12:20
此页的参用计数class
class U_Ptr{
friend class Hasptr;
int *ip;
size_t use;
U_Ptr(int *p): ip(p), use(1) {}
~U_Ptr() {delete ip;}
};
为什么这边会直接delete? delete一个没用动态配置的物件不是会有问题吗?
我实际编译也出问题,拿掉delete那行才通过编译。
还是说他本来是想写以下:
class U_Ptr{
friend class Hasptr;
int *ip;
size_t use;
U_Ptr(int *p): ip(new int(*p)), use(1) {}
~U_Ptr() { delete ip; }
};
作者: EdisonX (卡卡兽)   2016-05-28 03:20:00
这节是在讲 smart pointer , U_Ptr 只是一个代理 , 只负责最后的回收,且它的 ctor 也是 private,所以只有其friend class Hasptr 可以用它 . 采用的策略是用 Hasptr负责 new U_Ptr , 最后的 delete 交由 U_Ptr 自己做。
作者: Killercat (杀人猫™)   2016-05-28 07:11:00
不过实务上,大多数编译器在release的时候ip都会null所以delete没有问题,而所有的编译器在debug build都会把ip刻意设定成非null值,跑起来就会炸掉不过这个不是spec,不要依赖这种行为 :Q但是这个的ip不是从外面传进来的吗?除非故意乱传不然应该不是正确可delete的值就是null

Links booklink

Contact Us: admin [ a t ] ucptt.com