2009年9月15日 星期二

C++ auto pointer

相信許多寫C/C++語言的人一定都用過指標
C/C++指標很強大很好用
但使用時必須很小心
因為動不動就忘了將指標回收而造成了memory leak
或是不小心回收了卻又去存取指標造成系統crash
我們舉幾個例子好了

1.Dangling pointer
MyObject *A = new MyObject();
MyObject *B = A;
A->callMethod();
delete A; // free memory
A = NULL; // pointer to NULL to prevent access wrong memory address
B->callMethod(); //dangling pointer , system may crash

B指標指向一個可能已經被系統回收的記憶體
一般程式設計師會用以下的code來判斷這個指標是否可以被使用
if ( B != NULL )
B->callMethod();
但很顯然的B指標非NULL
它只是指向一個垃圾位址而已
你無法保證程式這樣執行一定正確而且不會crash

2.Exception發生
MyObject *A = NULL;
try{
A = new MyObject();
A->callMethod(); // exception may happen
delete A;
}
catch(..)
{
//error handle
如果你沒在這裡明確delete a,那一定memory leak
// delete A;
}

用C++的auto pointer不用害怕memory leak和dangling pointer
你只需要負責new你的記憶體就好
不需要要delete它
系統會自動回收不用的記憶體
例如

auto_ptr A( new MyObject() );
auto_ptr B = A;
auto_ptr C = A;
A->callMethod();
B->callMethod();
C->callMethod();

如果A記憶體被回收了
那B,C一定會是NULL
所以不會有dangling pointer的問題
如果允許使用auto pointer的話就儘量使用
可以提高系統的穩定度以及可靠度
你不用在茫茫code海中找到底那段code造成memory leak了

沒有留言:

張貼留言