简单的c++垃圾回收器

来源:互联网 发布:数据恢复软件评测 编辑:程序博客网 时间:2024/06/06 02:50

1.简介

动态分配内存是在运行期间从堆中获得内存,堆是提供给程序使用的自由存储区域。动态内存分配十分重要,它使得程序在执行期间可以获取、使用、释放然后重用内存。通常,有两种方法处理动态内存,一种是手工方式,即手动申请和释放内存;另一种是自动处理,也称为垃圾回收,当某块内存不在需要时会被回收器回收。通常是交替使用这两种方法。

2.1 两种内存管理方法的比较:

垃圾回收器会定期运行,查找不再有其他对象指向的内存块。当没有其他对象指向一个动态内存块时,意味着程序的元素不再使用这块内存,垃圾回收器就会释放它。

2.2 在c++中创建垃圾回收器

比较好的方法是建立一个能被任何动态分配的对象使用的垃圾回收器。垃圾回收器最重要的就是如何确定对象不再使用,看下面的代码:

int *p;

p=new int(99);

p=new int(100);

我们可以看出第一个地址不再使用可以释放掉,但是垃圾回收器如何知道不再使用这块内存呢?我们再把它改写一下:

int *p,*q;

p=new int(99);

q=p;

p=new int(100);

在这种情况下,也不能释放第一次分配的内存,因为现在q还在使用它,但是问题是垃圾回收器如何知道还有对象使用这一块内存呢?解决的方法是选择垃圾回收算法。

2.3 选择垃圾回收的算法

2.3.1 引用计数:这个计数在每次对内存的引用的时候加1,取消引用的时候减1,当计数减为0的时候内存不再使用即可释放。但有个缺点就是存在循环引用(两个对象互相指向对方)的时候计数值永远不为0。,为了解决这个问题还要设计一些解决方案。

2.3.2 标记并清除:分为两个阶段,第一阶段堆中所有的对象都被设置为未标记状态,而被变量访问的对象标记为“正在使用状态”,第二阶段会扫描所有已分配的内存释放未标记的元素。

2.3.3 复制:将内存分配到两个空间,第一个是活动空间,第二个是空闲空间。在运行的时候活动空间中的对象被复制到空闲空间,然后两个空间角色反转,活动变为空闲,空闲变为活动,之后又在活动空间中被使用的对象复制到空闲空间,如此反复。但其确定就是只允许使用一半的自由内存。

从上面的介绍我们采用引用计数这种方法,但对应循环引用,解决的方法是在垃圾回收器退出的时候释放任何已经分配的内存即可解决。