3. std::shared_ptr
先引入引用计数的概念
参考博客:https://blog.csdn.net/qq_29108585/article/details/78027867
简言之,当新建一个shared_ptr对象时,内存中会开辟一个区域来记录引用次数
引用计数会因如下原因增加:
- 用一个shared_ptr初始化另一个shared_ptr
- 用一个shared_ptr给另一个shared_ptr赋值
- 将shared_ptr作为参数传递给一个函数
- shared_ptr作为函数的返回值
引用次数会因如下原因减少:
- 给shared_ptr赋予一个新值
- shared_ptr被销毁(如离开作用域)
当引用计数减少为0时,销毁指针所指对象,即释放对象内存,调用析构函数
shared_ptr的内存结构如下图所示:
特性:
1.当一个std::shared_ptr对象被构建时(有3种方法实现这种构建:
(1).通过std::make_shared构建
(2).通过赋值构建
(3).通过unique_ptr转化
会生成一个控制块,其所占内存与对象在Heap中占用内存相同(即shared_ptr所占大小2倍与普通指针)
由控制块管理引用计数。
2.std::shared_ptr同样可以通过传递第二个模板参数来改变其默认析构方法,与unique_ptr不同的是,复写析构函数不回改变shared_ptr所占内存
3.引用计数的增减是属于原子操作。
4.std::enable_shared_from_this是一个模板类,继承这个类可以使shared_ptr构建的对象安全使用,示例:
1 class Widget: public std::enable_shared_from_this<Widget> { 2 public: 3 // factory function that perfect-forwards args 4 // to a private actor 5 6 template<typename... Ts> 7 static std::shared_ptr<Widget> create(Ts&&... params); 8 9 void process(); // as before 10 11 private: 12 13 };