Effective Modern C++: 智能指针(二)

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 };

猜你喜欢

转载自www.cnblogs.com/Asp1rant/p/12465198.html