1.shared_ptr 互相引用会出现资源不释放的问题,造成内存泄漏。

比如这段代码:

class C2;
class C1 {
private:std::shared_ptr<C2> _c2;
public:void setC2(std::shared_ptr<C2> c2) {_c2 = c2;}~C1() {std::cout << "kill c1\n";}
};class C2 {
private:std::shared_ptr<C1> _c1;
public:void setC1(std::shared_ptr<C1> c1) {_c1 = c1;}~C2() {std::cout << "kill c2\n";}
};void testptr()
{std::shared_ptr<C1> c1(new C1());std::shared_ptr<C2> c2(new C2());if (c1 && c2){c1->setC2(c2);c2->setC1(c1);}

这个问题并不直观。

换一种思考方式,假设在某一个时刻,智能指针中的C1对象被销毁,那么c1._c2才会销毁,这个时候引用了C2类型的shared_ptr引用计数才会有可能变成0(按照我们的例子,就是在这个时刻引用计数变成0),智能指针中的C2对象才会被销毁,而也只有在智能指针中的C2对象被销毁时,引用了C1类型的shared_ptr引用计数才会变成0,这个时候才会去析构智能指针中的C1对象,所以分析到这里,我们会发想刚才的假设不会发生。这样就形成了一个互相牵制的死结。

两种解决方案:

1.如果确实需要按照testptr函数中的方式调用,则根据业务理清两个类的关系,哪个类生命周期依赖另一个,将命长的那个类作为shared_ptr作为命短的类的成员,将命短的那个类作为wead_ptr作为命长的类的成员,并在使用的时候,通过wead_ptr::lock()得到shared_ptr,保证使用范围内,命短的成员不会挂掉。

2.避免testptr函数中的调用方式,如果业务允许,可以考虑:

     c1->setC2(c2);c2->setC1(c1_1);//std::shared_ptr<C1> c1_1(new C1());

weak_ptr并不像shared_ptr一样维护引用计数,所以不会存在像shared_ptr的问题,但是引入的新问题是,如果使用weak_ptr,即便是你定义了一个变量,这个变量的存活期也并不能由你来掌控,所以是一个弱控制的指针,只有在调用lock拿到一个shared_ptr的这段时间里,是你可以确定你的变量是真实存活着的。并且weak_ptr并不能单独使用,只能配合shared_ptr或者其他weak_ptr一同使用,来解决shared_ptr互相引用的问题。

unique_ptr旨在替代auto_ptr,因为auto_ptr的copy导致的被copy对象变成null的问题,整体用法就是提供对内存对象的独占访问,并且使用release显式移交所有权。

shared_ptr,weak_ptr,unique_ptr相关推荐

  1. auto_ptr scoped_ptr shared_ptr weak_ptr unique_ptr

    1. auto_ptr C++98 出现,已经被废了,可以所有权的自动转让,不能作为容器元素. 2. scoped_ptr boost中类似auto_ptr只希望在本作用域里使用,不希望被转让.拷贝构 ...

  2. 学习笔记 | c++中的smart pointer四个智能指针 shared_ptr、unique_ptr、weak_ptr、auto_ptr

    c++中的smart pointer四个智能指针 C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr其中后三个是c++11支持,并且第一个 ...

  3. C++11 解决内存泄露问题的智能指针:shared_ptr、unique_ptr、weak_ptr

    我们经常听到内存泄漏,但是对这个抽象的概念一直没有什么理解,比如产生内存泄漏又将如何,我平时写程序从来不考虑这个等等.这篇的目的:第一,给大家实验实验内存泄露带来的问题,让大家直观感受内存泄露.第二, ...

  4. 智能指针shared_ptr、unique_ptr、weak_ptr

    智能指针 智能指针解决的问题 智能指针分类 shared_ptr 内存模型图 shared_ptr示例 shared_ptr含义 shared_ptr基本用法及常用函数 常用函数 智能指针的构造,初始 ...

  5. C++智能指针shared_ptr、unique_ptr以及weak_ptr

    目录 shared_ptr类 shared_ptr和unique_ptr都支持的操作 shared_ptr独有的操作 make_shared函数 shared_ptr自动销毁所管理的对象 由普通指针管 ...

  6. 智能指针(shared_ptr、unique_ptr、weak_ptr)的使用

    智能指针的使用 一.shared_ptr 1.创建一个shared_ptr 2.shared_ptr的常用成员函数 reset成员函数的使用 3.==注意事项== 二.unique_ptr 1.uni ...

  7. 【C++】智能指针(auto_ptr,shared_ptr,unique_ptr)及 shared_ptr 强引用原理

    C++智能指针(Smart Pointer) 传统指针存在的问题 auto_ptr 智能指针的简单自实现 shared_ptr shared_ptr 内存销毁的原理(强引用) shared_ptr 的 ...

  8. 传说中的神器: shared_ptr/weak_ptr/scoped_ptr

    ref page1 and page2 <Linux多线程服务端编程>称 shared_ptr/weak_ptr 之为神器. in multi-threading programming, ...

  9. C++——智能指针——auto_ptr、shared_ptr、unique_ptr

    1.4.智能指针 智能指针是行为类似于指针的类对象. C++11 中提供了三种智能指针,使用这些智能指针时需要引用头文件 : ·shared_ptr; ·unique_ptr; ·auto_ptr; ...

最新文章

  1. 学术 | 一种新的CNN网络可以更高效地区分自然图像生成图像
  2. 干货 | 45张图庖丁解牛18种Queue,你知道几种?
  3. 10、kubernetes 核心技术-Secret、ConfigMap
  4. SVN Git 设置忽略目录 大全
  5. [公告]博客园新服务器照片
  6. How to setup SLF4J and LOGBack in a web app - fast--转载
  7. 以太坊知识教程------智能合约(3)函数修饰符
  8. Android Studio 模拟器 不要皮肤,效果更好
  9. 【转】带你玩转Visual Studio——02.带你新建一个工程
  10. 服务化改造的云上利器 | 阿里云 EDAS 重大升级发布
  11. vb未找到方法或数据成员_答疑 | VB首行的Option Explicit有何作用?
  12. Java中如何遍历Map对象(值得借鉴)
  13. 90 后篮球运动员成功转型 iOS 开发,过程超刺激
  14. 百度地图API实现地理围栏
  15. 主动变被动9个例句_小管理,大智慧——激发团队变被动为主动的奥秘
  16. Android识别图片中的WIFI二维码,并自动连接
  17. IsValid函数基本用法
  18. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 解决方法
  19. MaskRCNN源码解析1:整体结构概述
  20. 汉诺塔python代码解释_python求解汉诺塔游戏

热门文章

  1. 《黑客与画家》读书笔记(三)
  2. 作为一个程序员,如何保持优秀
  3. 《小孩-大冰》阅读笔记
  4. 河南二级分销系统开发|二级分销是如何分佣的?
  5. 只狼服务器维修或停机,只狼存档怎么替换 只狼存档损坏修复方法介绍_游侠网...
  6. 合并时显示是无效的m3u8文件_m3u8合并,如何合并m3u8文件
  7. A Survey on Knowledge Graphs___Representation, Acquisition and Applications.知识图谱综述:表示,获取,应用
  8. PredRNN++: Towards A Resolution of the Deep-in-Time Dilemma in Spatiotemporal Predictive Learning
  9. 日拱一卒,集小胜为大胜; 学以致用,在战争中学习战争;
  10. HBuilderx连接微信开发者工具