原文地址:http://blog.sina.com.cn/s/blog_62b4e3ff0100v1tc.html
条款1:不要把一个原生指针给多个shared_ptr管理
条款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