来自博客:https://www.cnblogs.com/lzpong/p/6188034.html

多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用,

在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃,

所以为了省时间一般都是任由这个内存泄漏发生.

当然也可以经过复杂的设计,由一个监控线程来统一删除,

但这样会增加代码量和复杂度.这下好了,shared_ptr 可以方便的解决问题,因为它是引用计数和线程安全的.

shared_ptr不用手动去释放资源,它会智能地在合适的时候去自动释放。

  原理:当多个shared_ptr管理同一个指针,仅当最后一个shared_ptr析构时,指针才被delete。这是怎么实现的呢?答案是:引用计数(reference counting)。引用计数指的是,所有管理同一个裸指针(raw pointer)的shared_ptr,都共享一个引用计数器,每当一个shared_ptr被赋值(或拷贝构造)给其它shared_ptr时,这个共享的引用计数器就加1,当一个shared_ptr析构或者被用于管理其它裸指针时,这个引用计数器就减1,如果此时发现引用计数器为0,那么说明它是管理这个指针的最后一个shared_ptr了,于是我们释放指针指向的资源

  demo:

#include<iostream>
#include<memory>
//g++ shared_ptr.cpp -std=c++11
int main() {
int *p = new int(30);
std::shared_ptr<int> bptr(p);//初始化方式1
std::shared_ptr<int> aptr = std::make_shared<int>(20);//初始化方式2
std::shared_ptr<int> cptr(aptr);//初始化方式3

std::cout << "aptr.use_count() = " << aptr.use_count() <<" value = "<<*aptr<<std::endl;//use_count 是引用计数器
std::cout << "bptr.use_count() = " << bptr.use_count() <<" value = "<<*bptr<<std::endl;
std::cout << "cptr.use_count() = " << cptr.use_count() <<" value = "<<*cptr<<std::endl;
}

最新文章

  1. H5案例分享:JS手势框架 —— Hammer.js
  2. Android 图标尺寸与设计
  3. centos7 yum 方式安装nginx
  4. iframe布局
  5. TabActivity 切换Activity界面
  6. SqlIO优化
  7. JS在IE和FireFox之间常用函数的区别小结
  8. session和cookie的区别和联系
  9. PHP中的XML解析的5种方法
  10. InstallShield: Component-Feature Associations
  11. 网页frame引入实现全屏滚动,使用jquery实现浏览器兼容
  12. [python] 如何用python操作Excel
  13. L1 正则 和 L2 正则的区别
  14. cURL安装和使用笔记
  15. iOS 判断数组不为空
  16. whatwg-fetch源码分析
  17. 查看oracle数据库里哪些语句耗时最长或者效率最低
  18. datagrid 新增,并行内编辑,提交保存
  19. slice全解析
  20. UIActionSheet的常用方法

热门文章

  1. POJ1308
  2. 读书笔记 Week5 2018-4-5
  3. 配置环境是程序员的第一步 -- Xshell 6 免费版下载安装
  4. day18-事务与连接池 2.事务介绍与mysql下事务操作
  5. laravel与front-end
  6. IP命令的用法详解
  7. Java集合框架---重构设计
  8. 编写高质量代码改善C#程序的157个建议——建议44:理解委托中的协变
  9. (一)在HTML页面中实现一个简单的Tab
  10. [算法基础]Big O Notation时间复杂度计算方法