循环引用和解决方案

如何处理循环引用问题?

什么是循环引用?

顾名思义,两个对象之间形成环路。对于C++中两个对象来讲,使用智能指针解决不了这个问题。因为其引用计数不为0。

循环引用解决办法

循环引用涉及的问题是垃圾回收(Garbage Collection,GC)。垃圾就是不再被引用的对象。讨论基本的垃圾回收算法。

详见:GC基本算法讨论

(1)引用计数算法

原理:唯一一种不用根集概念的GC算法。为每个对象加一个计数器,记录所有指向该对象的引用数量。根据计数值判断该对象的状态。

优点:实现简单,在原生不支持GC的语言中容易实现出来。即时回收,对象不再被引用时立即释放。

缺点:不能解决循环引用问题 。再者,当多个线程同时对引用计数进行增减时,引用计数的值可能会产生不一致的问题,必须使用并发控制机制解决这一问题,也是一个不小的开销。

(2)Mark & Sweep算法

原理:动态申请内存时先按需分配,当内存不足时则从寄存器、程序栈上的引用(程序员写的)出发,遍历上述的有向可达图,对不能到达的对象进行标记。然后再次遍历,释放未标记的对象。

缺点:在分配大量对象时,且对象大都需要回收时效率偏低。因为要遍历2次。

(3)节点复制算法

原理:从根节点开始遍历,被引用的对象会被复制到一个新的区域,剩下的即为垃圾。释放内存时,直接把原来的存储区释放。

优缺点:当需要回收的对象越多时,开销很小。当大部分对象不再需要回收时,开销反而很小。

这三种是基本算法。可以在此基础上改进融合。

C语言本身没有提供GC机制。而C++ 0x则提供了基于引用计数算法的智能指针进行内存管理。也有一些不作为C++标准的垃圾回收库,如著名的Boehm库。借助其他的算法也可以实现C/C++的GC机制,如前面所说的标记清除算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值