一个设计问题:如何在C/C++中释放循环引用的对象(垃圾回收)

tutu_cloud 2007-07-31 04:51:07
当出现循环引用的情况下,使用计数方式的智能指针无法自动释放对象。那么怎样才能释放这样的对象,或者说设计的时候就不应该出现循环引用?如果说不应该出现循环引用的话,那么在一个足够复杂的系统中,如何才能避免出现循环引用?
...全文
429 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵增光 2010-05-21
  • 打赏
  • 举报
回复
参见Python源代码,过程为:复制引用链,获得根集,标记,回收。该方法效率低,但最简单。
星羽 2007-08-01
  • 打赏
  • 举报
回复
当出现循环引用的情况下,使用计数方式的智能指针无法自动释放对象?

A B 循环引用

这个时候 A B 的计数都是2

当释放 A

A B 的计数都为 1

你是想让B的A引用也释放吗?
星羽 2007-08-01
  • 打赏
  • 举报
回复
从设计上解决吧
北极猩猩 2007-08-01
  • 打赏
  • 举报
回复
除了循环引用的问题之外,引用计数还有一个很大的性能缺陷。

那就是在枚举容器中对象的时候,每次都要增加、减少引用计数,如果你的枚举操作很多的话还是很浪费的。
晨星 2007-07-31
  • 打赏
  • 举报
回复
这是引用计数的一个先天的缺陷吧。
所以引用计数的垃圾回收现在也不大被人看好了,包括在Java虚拟机的设计中。实际上,基于引用计数的垃圾回收效率也并不高过其它方式。
Vitin 2007-07-31
  • 打赏
  • 举报
回复
如果出现了循环引用,那么大概可以归结为一个设计错误。
对于聚合关系(aggregation)而言,“你中有我、我中有你”的情况是不允许的。
你可以检查看看。一般情况下,其中一处不应该用智能指针表示聚合关系,而应该用内建指针表示单纯的关联关系(association),不需要随主对象一起释放。
Inhibitory 2007-07-31
  • 打赏
  • 举报
回复
这种情况尽量避免吧。
jixingzhong 2007-07-31
  • 打赏
  • 举报
回复
等新的吧 ...

只能尽量避免这种无奈的问题了 ...
taodm 2007-07-31
  • 打赏
  • 举报
回复
没办法,靠人脑设计的时候就避免。还是等c++09标准的垃圾回收吧。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧