大胆尝试之

大胆尝试之<C++: delete this>

 

在C++中, 最要命的事情莫过于指针的使用了.
指针使用的时候, 前辈们每每会讲:
1. 指针使用之前一定要检查是否为空;
2. 指针指向的对象被析构的时候, 要尽量做到指向这个对象的所有指针置空;
上文中之所以是"尽量", 因为我们常常做不到这一点(尤其是我们要跨结构使用的时候),
有时候为了效率, 某些底层代码也没必要都这样实现(比如在析构函数里面).

在C++中, 使用This指针之前, 一定会有一个(指向该对象的)指针将程序的执行引入到成员函数.
如果Delete This, 必将会使这个指针称为野指针.
同时, this也成为了一个野指针.

所以剩下的问题是如何对付
1. this指针
2. 外界(地址上 = this)的野指针
对付"1", 比价容易, 只要this之后不要再操作成员变量即可;
对于其他的野指针呢?

这里给一个简单的实现:
//! class A
void A::Destory(A*& pA)
{
 ...
 delete this;
 pA = NULL;//! 置空外界的指针
 return;
}
显然, 这里处理野指针的能力非常的有限.


所以给一个比较全面的解决方案:
使用ReferencePtr(指针的功能描述, 见BLOG之指针新需求)
只要A对象一旦被清理, 所以ReferencePtr都会自动置空, 这样方便安全的解决了问题.
不少人可能会觉得, Reference的代价是不是会很大.
我这里不好说, 如果只是算法上的复杂度, 都是O(1)的.
其实ReferencePtr的强大功能目前还没有被挖掘出来,
比如从各种STL容器中移除对象, 如果用ReferencePtr 很多情况能保证是O(1).

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值