C++-如何检测或者解决循环引用计数的问题(简单而行之有效的方法)?

C++-如何检测或者解决循环引用计数的问题(简单而行之有效的方法)?

泛泛之交 发布于 2017-09-14 字数 1418 浏览 996 回复 1

可能重复的问题
如何检测或者解决循环引用计数的问题(简单而行之有效的方法)?

A引用B,B引用A,导致对方引用计数增加,内存释放可能出现问题,大体这样。

下面是一个例子:

//以下出现的类继承自Object
//Object中提供retain(引用计数增1)和release(引用计数减1)操作,
//autoRelease操作将该对象的存储释放工作交给辅助对象处理

class FPC_DLL DisplayObject:public EventDispatcher
{
public:

void setParent(DisplayObjectContainer* parent)
{
pParent_ = parent;
pParent_.retain(); //循环引用,引用计数出现问题
}
}

class FPC_DLL DisplayObjectContainer:public DisplayObject
{
private:

Array* pChildren_;
public:

~DisplayObjectContainer()
{
pChildren_.release();
}

void addChildAt(DisplayObject* child,uint32 index)
{
child->retain();
child->setParent(this);
//内含对child的retain操作
pChildren_->insertObject(child,FPC_MIN(pChildren_->count(),index));
child->release();
}
}

////////////////////////////////////////////////////////////////
{
DisplayObject* do = new DisplayObject;
DisplayObjectContainer* doc = new DisplayObjectContainer;
do.autoRelease();
doc.autoRelease();
doc.addChild(do);
//辅助对象释放存储可能出现问题
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

归属感 2017-09-16 1 楼

能解决问题就好,小宇宙凌乱吧。。
weak pointer是一个解决方案,似乎也是比较简单有效的。

RC的循环引用就是一个硬伤,使用RC意味着要更多的思考,但是似乎对于C++,RC还是一个很好的策略。

期待有更好的答案。