# 解决智能指针相互引用导致的内存泄露
# 问题描述
智能指针相互持有时会造成内存泄露。智能指针和普通指针相互持有也是。
一般出现在共享指针(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]:
- 使
EnableSharedPtr
类继承自std::enable_shared_from_this<EnableSharedPtr>
- 将
this
直接替换为shared_from_this()
。 - 这一点是构造函数中特有的:需要在构造函数完成后再调用含有
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)