1、shared_from_this()方法
(1)使用shared_from_this()的类需要继承enable_shared_from_this<T>,shared_from_this()是这个基类的方法,另外一定要public继承,private继承也会出现bad_weak_ptr的问题。
(2)使用shared_from_this()获得对象的shared_ptr之前,一定要保证已经构造shared_ptr<T>,因为shared_from_this()方法中用到的weak_ptr是在构造shared_ptr<T>的时候赋值的。
2、shared_ptr的循环引用问题
从43,44行的打印结果看到出现了循环引用,为什么呢?因为执行完41行之后,shared_ptr<A> a1和shared_ptr<B> b1开始析构,当a1析构的时候,由于b1.a_还引用a1,所以a.use_count = 3-1 = 2,a1没有真正析构,也就不会析构a1.b_,当b1析构的时候也是同样的,所以b.use_count = 3-1 = 2,所以循环引用会导致内存泄漏。需要使用weak_ptr。
3、shared_ptr的线程安全
shared_ptr线程安全 可以看这个文章,这里讨论的是多线程读写shared<T>这个智能指针对象,主要通过调用shared_ptr<T>的构造函数,赋值函数,reset函数这些,而不是智能指针指向的真实内存对象。
总结如下:
shared_ptr提供了与内置类型同级别的线程安全性。
(1) 同一个shared_ptr对象可以被多线程同时读取。
(2)不同的shared_ptr对象可以被多线程同时修改。即使这些shared_ptr对象指向同一个内存对象也没有问题,因为这些操作主要是对use_count的操作,shared_ptr内部通过cas保证安全。
(3) 同一个shared_ptr对象不能被多线程直接修改,但可以通过原子函数完成。这里主要是因为同一个shared_ptr对象的修改不是原子的,需要修改use_count和内存对象指针,可能会出现中间态。