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

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了,于是内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值