1. shared_ptr 引起内存泄漏的情况
当一个类持有另一个类的智能指针变量时,会遇到这种情况:两个对象同时都持有对方的一个智能指针,当其作用域结束时,两个 shared_ptr 的引用计数都没有变为 0,这块内存的空间无法释放,引起内存泄漏。
示例代码如下:
#include <memory>
using namespace std;
class B;
class A {
public:
void set_shared(shared_ptr<B> sb) {
myb = sb;
}
private:
shared_ptr<B> myb;
};
class B {
public:
void set_shared(shared_ptr<A> sa) {
mya = sa;
}
private:
shared_ptr<A> mya;
};
int main(){
shared_ptr<A> sa = make_shared<A>();
shared_ptr<B> sb = make_shared<B>();
sa->set_shared(sb);
sb->set_shared(sa);
}
2. valgrind 验证
3. 解决方法
- 避免写出类似的代码
- 使用 weak_ptr 弱引用