大胆尝试之<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).