C++中智能指针循环指向的陷阱

来源:互联网 发布:类似于硕鼠的软件 编辑:程序博客网 时间:2024/05/16 14:18

C++利用引用技术和智能指针可以实现对堆内存的自动管理,当智能指针退出生命周期时,会减小管理对象的引用计数,当对象引用计数为0时,便释放该堆内存资源。看上去这一技术很不错,堆内存有生命周期了,不用手动释放了。实时上智能指针任然存在危险,下面就是一个例子。

class A;
class B;

class A
{
private:
int refCount;// 引用计数,reference count
...
public:
Ptr<B> pB;// 智能指针,smart pointer
};

class B
{
private:
int refCount;// 引用计数,reference count
...
public:
Ptr<A> pA;// 智能指针,smart pointer
};

...
Ptr<A> insA = new A;// insA->refCount = 1
Ptr<B> insB = new B;// insB->refCount = 1
insA->pB = insB;// insA->refCount = 2
insB->pA = insA;// insB->refCount = 2
...

上述代码中的insA和insB指向的内存似乎在两个智能指针退出生命周期后会自动释放掉,实际上不然,假如insA先退出生命周期,insA->refCount减1,insA->refCount == 1;insA不会释放,于是有insB->refCount == 2;然后insB退出生命周期,insB->refCount--,insB->refCount == 1;insB为释放,此时已经没有时机释放insA和insB了,于是内存泄漏。

原创粉丝点击