一、什么是引用計數?
引用計數是內存管理的一個技巧,可以看做是一種簡單的垃圾回收機制,它允許多個擁有共同值的對象共享同一個對象。
二、為什么采用它?
對于沒有垃圾自動回收機制的語言(如C/C++)和技術(如COM)來說,引用計數提供了一種簡潔高效的內存管理方法。
使用引用計數就可以拋開這個問題,我們不需要再去關心誰擁有了這個對象,因為我們把管理權交割給了對象自己(這有點類似__stdcall和__cdecl兩種函數調用約定)。當這個對象不再被任何人使用時,它自己負責銷毀自己。
三、誰都在使用它?
現在很多技術和編程語言都在使用它,如COM,Object-C等,如果我們愿意,我們可以在自己的程序中使用它。
四、我該如何實現它?
下面我給出一個很簡單的例子,演示如何實現引用計數。
PS: 這里是云風寫的一篇文章《引用計數與垃圾回收之比較》,我認為寫的非常好。
引用計數是內存管理的一個技巧,可以看做是一種簡單的垃圾回收機制,它允許多個擁有共同值的對象共享同一個對象。
二、為什么采用它?
對于沒有垃圾自動回收機制的語言(如C/C++)和技術(如COM)來說,引用計數提供了一種簡潔高效的內存管理方法。
- 它簡化了跟蹤處理堆中對象的過程。
使用引用計數就可以拋開這個問題,我們不需要再去關心誰擁有了這個對象,因為我們把管理權交割給了對象自己(這有點類似__stdcall和__cdecl兩種函數調用約定)。當這個對象不再被任何人使用時,它自己負責銷毀自己。
- 簡單并且高效。
三、誰都在使用它?
現在很多技術和編程語言都在使用它,如COM,Object-C等,如果我們愿意,我們可以在自己的程序中使用它。
- COM
- COM的宿主DLL
- Object-C
四、我該如何實現它?
下面我給出一個很簡單的例子,演示如何實現引用計數。
class Foo{
public:
Foo(){
_ref = 1;//構造成功之后計數即為1
}
//輔助,用來打印引用計數
void Print(){
std::cout << "_ref = " << _ref << std::endl;
}
public:
//增加引用計數
ULONG AddRef(){
return InterlockedIncrement(&_ref);
}
//減少引用計數
ULONG Release(){
if (0 == InterlockedDecrement(&_ref)){
delete this;
return 0;
}
return _ref;
}
private:
long _ref;
};
int main(int argc, char *argv[])
{
Foo * foo = new Foo;
foo->Print();//輸出:_ref = 1
foo->Release();
foo->Print();//輸出:_ref = 隨機數字
return 0;
}
public:
Foo(){
_ref = 1;//構造成功之后計數即為1
}
//輔助,用來打印引用計數
void Print(){
std::cout << "_ref = " << _ref << std::endl;
}
public:
//增加引用計數
ULONG AddRef(){
return InterlockedIncrement(&_ref);
}
//減少引用計數
ULONG Release(){
if (0 == InterlockedDecrement(&_ref)){
delete this;
return 0;
}
return _ref;
}
private:
long _ref;
};
int main(int argc, char *argv[])
{
Foo * foo = new Foo;
foo->Print();//輸出:_ref = 1
foo->Release();
foo->Print();//輸出:_ref = 隨機數字
return 0;
}
PS: 這里是云風寫的一篇文章《引用計數與垃圾回收之比較》,我認為寫的非常好。