shared_ptr和weak_ptr的配合使用是个问题。unique_ptr的使用场合似乎比较局限。 文章C++ 智能指针详解(一)——unique_ptr - 知乎 (zhihu.com)
介绍了unique_ptr的使用。它可以由shared_ptr转来,主要用到了std::move。 主要场景其中提到:
- 为动态分配内存提供异常安全(RAII)
- 将动态分配内存的所有权传递给函数
- 从函数内返回动态分配的内存(工厂函数)
- 在自定义容器中保存指针
- 在对象中保存多态子对象(数据成员)
值得关注。
weak_ptr的特性如下所示:(此部分转自https://blog.csdn.net/zhghost/article/details/110212029)
1.不具有普通指针的行为,没有重载operator*和->。
2.它的最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况。
3.weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。
4.weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。
weak_ptr的使用特点:
1.使用weak_ptr的成员函数use_count()可以观测资源的引用计数,
另一个成员函数expired()的功能等价于use_count()==0,
但更快,表示被观测的资源(也就是shared_ptr的管理的资源)已经不复存在。
2.weak_ptr可以使用一个非常重要的成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象,
从而操作资源。
3.当expired()==true的时候,lock()函数将返回一个存储空指针的shared_ptr。
weak_ptr可以保存一个“弱引用”,指向一个已经用shared_ptr进行管理的对象。为了访问这个对象,一个weak_ptr可以通过shared_ptr的构造函数或者是weak_ptr的成员函数lock()转化为一个shared_ptr。当最后一个指向这个对象的shared_ptr退出其生命周期并且这个对象被释放之后,将无法从指向这个对象的weak_ptr获得一个shared_ptr指针,shared_ptr的构造函数会抛出异常,而weak_ptr::lock也会返回一个空指针。(【C++11】新特性——weak_ptr_weak_ptr释放-CSDN博客)
这里的lock比较重要。总之,个人认为尽量避免用到weak_ptr,这使得逻辑显得不够健壮。在复杂的系统中,容易引起空指针访问问题的尴尬。
以下原理性的介绍转自C++智能指针——auto_ptr、unique_ptr和shared_ptr详解_unique_ptr malloc-CSDN博客