智能指針

1、auto_ptr的意義

std::auto_ptr是C++標準庫裏面的模板庫,屬於智能指針。當系統異常退出的時候避免資源泄露(內存)。其他的資源還對應其他的智能指針。

2、auto_ptr的使用

std::auto_ptr<int>test(new int(1));

test將是一個auto_ptr的對象,使用一個int指針進行初始化。

test可以象其他指針一樣使用,如使用*使用->但是++不可以使用,以後也許會擴展,其實難對++做越界管理,也許可以放棄一些速度。

當使用auto_ptr的時候,必須使用顯示的類型轉化來初始化,如auto_ptr<class A>a(new classA)

而不能使用auto_ptr<class A> a=new classA;

3、auto_ptr所有權的轉移

auto_ptr對所有所有權有嚴格的約定,一個auto_ptr只能控制一個指針,不能控制多個,當auto_ptr擁有一個指針的時候就不能在擁有其他的指針了。同時,不同的auto_ptr不能擁有同一個指針。


智能指針實質上是一個棧對象,而並非指針類型。C++的auto_ptr的作用是動態分配對象以及當對象不再需要時自動執行清理。

使用std::auto_ptr,要#include<memory>。

(1)儘量不要使用“operator=”(如果使用了,請不要在使用先前對象)。

(2)記住release()函數不會釋放對象,僅僅歸還所有權。

(3)std::auto_ptr最好不要當成參數傳遞(讀者可以自行寫代碼確定爲什麼不能)。

(4)auto_ptr存儲的指針應該爲NULL或者指向動態分配的內存塊。

(5)auto_ptr存儲的指針應該指向單一物件(是new出來的,而不是new[]出來的)。auto_ptr不能指向數組,因爲auto_ptr在析構的時候只是調用delete,而數組應該要調用delete[]。

(6)auto_ptr作爲成員變量,以避免資源泄露。

(7)auto_ptr不能共享所有權,即不要讓兩個auto_ptr指向同一個對象。

(8)auto_ptr不能作爲容器對象,STL容器中的元素經常要支持拷貝,賦值等操作,在這過程中auto_ptr會傳遞所有權,那麼source與sink元素之間就不等價了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章