内存垃圾回收(Garbage Collection)是一个很古老的技术了,最开始在Lisp上出现。如今几乎所有高级语言都有GC,大部分程序员不再需要绞尽脑汁通宵达旦去查找内存泄露的原因了。我以前也不怎么关心垃圾回收这个问题,可是面试时老是被问到智能指针,而我又不会写,因为我对C++不熟。所以决定研究并且总结一下这个问题。
其实智能指针都不能称为GC,就是编译器给你加了delete或free,基于的原理是引用计数(Reference Counting)。GC一般基于一下两个原理
Reference Counting(引用计数): 每个对象都设置一个参数,就是引用它的变量,引用少一个就减1,多一个就加1,为0时回收
Reachability(可达性):有一组基本的对象或变量是可达的,称为root set,这些变量或对象指向的对象也是可达的,同理,一个可达对象指向的对象是可达的。
本文简单的介绍了常用的几种内存回收算法,包括Reference Counting,Mark and Sweep,Semispace, Generation。
Reference Counting
一般没有真正的GC使用Reference Counting。智能指针使用了Reference Counting,在指针析构的时候,将引用数减1,为0时顺便把指向的对象回收了。
一个简单的智能指针的实现(用于应付面试)template class SmartPointer {
protected:
T* ref;
unsigned int * ref_count;
public:
SmartPointer(T *ptr)
{
ref = ptr;
ref_count = (unsigned int*)malloc(sizeof(unsigned int));
*ref_count = 1;
}
SmartPointer(SmartPointer & sptr)
{
ref = sptr.ref;
ref_count = sptr.ref_count;
+