首页 > 编程语言 > 详细

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

时间:2020-03-11 20:46:27      阅读:68      评论:0      收藏:0      [点我收藏+]

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

 

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

原文:https://www.cnblogs.com/Asp1rant/p/12465198.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!