原文地址:http://blog.sina.com.cn/s/blog_62b4e3ff0100v1tc.html


条款1:不要把一个原生指针给多个shared_ptr管理
int* ptr = new int;
shared_ptr p1(ptr);
shared_ptr p2(ptr); //logic error
ptr对象被删除了2次
这种问题比喻成“二龙治水”,在原生指针中也同样可能发生。

条款2:不要把this指针给shared_ptr
class Test{
public:
    void Do(){  m_sp =  shared_ptr(this);  }
private:
    shared_ptr m_member_sp;
};

Test* t = new Test;
shared_ptr local_sp(t);
p->Do();

发生什么事呢,t对象被删除了2次!
t对象给了local_sp管理,然后在m_sp =  shared_ptr(this)这句里又请了一尊神来管理t。
这就发生了条款1里“二龙治水”错误。

条款3:shared_ptr作为被保护的对象的成员时,小心因循环引用造成无法释放资源。
对象需要相互协作,对象A需要知道对象B的地址,这样才能给对象B发消息(或调用其方法)。
设计模式中有大量例子,一个对象中有其他对象的指针。现在把原生指针替换为shared_ptr.

假设a对象中含有一个shared_ptr指向b对象;假设b对象中含有一个shared_ptr
12-17 09:01