# 解决智能指针相互引用导致的内存泄露

# 问题描述

智能指针相互持有时会造成内存泄露。智能指针和普通指针相互持有也是。

一般出现在共享指针(shared_ptr)之间,或者共享指针和普通指针(xxx *)之间。

# 解决办法

如果是共享指针之间相互持有:将其中一个改为 weak_ptr。

如果是共享指针和普通指针相互持有:将普通指针改为 weak_ptr。

# weak_ptr 如何操作

weak_ptr 没有重载 operator->operator * 操作符,因此不可直接通过 weak_ptr 使用对象。

使用方法[1]

shared_ptr<int> ptr = make_shared<int>(10); 
weak_ptr<int> ptr1 = ptr; // 必须使用shared_ptr初始化weak_ptr  
shared_ptr<int> ptr2 = ptr1.lock(); // 利用返回的shared_ptr初始化

# weak_ptr 中构造函数使用了 this

weak_ptr 指向的对象,其类的构造函数中不能使用 this ,需要使用 shared_from_this() 来代替。原因是:智能指针在构造函数执行完毕后生成,此时还不存在引用计数指针。

shared_from_this() 的使用方法为,以 EnableSharedPtr 类为例[2]

  1. 使 EnableSharedPtr 类继承自 std::enable_shared_from_this<EnableSharedPtr>
  2. this 直接替换为 shared_from_this()
  3. 这一点是构造函数中特有的:需要在构造函数完成后再调用含有 shared_from_this() 的函数(例如[2:1]中的 GetObject() )为对应变量真正赋值。

# 附:一些看过的帖子

有助于了解,不一定用上了

  • 即使正确使用 make_shared,shared_from_this () 也会导致 std :: bad_weak_ptr | (1r1g.com)

  • 智能指针的辅助函数 std::make_shared 和 std::enable_shared_from_this - 阅微堂 (zhiqiang.org)

  • C++ 智能指针的正确使用方式 - 百度文库 (baidu.com)

  • weak_ptr 与 shared_ptr_gettogetto 的博客 - CSDN 博客

  • OC 内存泄漏_Titanium、的博客 - CSDN 博客_oc 内存泄漏

  • [C++11] shared_ptr 使用的注意事项 (内存被重复析构,内存泄漏问题)_唐火的博客 - CSDN 博客_指针重复析构

  • shared_ptr 共享指针的陷阱,交叉引用导致内存泄漏_过往山海的博客 - CSDN 博客_共享指针内存泄漏

  • 使用指南:共享指针与普通指针 - 或代码 (orcode.com)


  1. 弱类型指针 weak_ptr 的使用 (详解)_肥肥胖胖是太阳的博客 - CSDN 博客_weak_ptr 使用 ↩︎

  2. 智能指针之与 shared_ptr 有关的 enable_shared_from_this 类模板 04_Mango 酱的博客 - CSDN 博客 ↩︎ ↩︎