shared_ptr循环引用而产生内存泄漏

转自 :https://blog.csdn.net/u013040821/article/details/80517552

循环引用为什么会导致内存泄漏?
自智能指针的原理说起,一个智能指针在创建一个对象的时候初始化引用计数为 1,并把自己的指针指向创建的对象。但这个引用计数在何处?在智能指针内部?非也,这个计数是一个单独的对象来实现的,如图1,当另外一个智能指针指向这个对象的时候,便找到与这个对象对应的计数对象,并加一个引用,即 use_count++。这样多个智能指针对象便可以使用相同的引用计数。

引用计数原理

而如果产生相互引用的情况,类似以下代码:

class Person {
public:
    ...
    shared_ptr<Person> best_friend;
};
Person pa = make_shared<Person>();
Person pb = make_shared<Person>();
pa->best_friend = pb;
pb->best_friend = pa;

即使 pa 和 pb 均离开作用域析构掉了,内存也不会释放。为何?在 pa 离开作用域后,pa 这个只能指针对象实际上已经死亡了,但是 pa 所指向的对象并没有死亡,因为此时 pb 中的一个只能指针指向了这个对象。在 pb 离开作用域后,pb 这个智能指针实际上也完了,但是 pb 所指向的对象并没有死亡,因为 pa 曾经指向的对象中还有着一个指向它的指针。最后,由于两个对象保存着指向对方的指针,它们的引用计数均为 1,导致了内存无法释放。
在这里插入图片描述
在理解了智能指针的实现原理和循环引用导致内存泄漏的原理后,使用 weak_ptr 这种不增加引用计数的弱指针便可以很好地解决这个问题。

猜你喜欢

转载自blog.csdn.net/winter_wu_1998/article/details/85239975