在c++11中,已經不使用auto_ptr,而用 unique_ptr進行替代,不過二者原理都差不多。標頭檔案:memory
智慧型指標:實質上是乙個類,在建立智慧型指標的時候,本質上是在棧上建立了乙個物件,而析構函式總是會在出棧時被呼叫,清理會自動進行。unique_ptr(auto_ptr)通過在棧上構建乙個物件a,物件a中動態分配記憶體指標p,所有對指標p的操作都轉為對物件a的操作。而在a的析構函式中會自動釋放p的空間,而該析構函式是編譯器自動呼叫的,無需程式設計師操心。
unique_ptr(auto_ptr):都是唯一指標,且只能智慧型指標都要直接初始化,但unique_ptr(auto_ptr)不能像shared_ptr那樣共享,對於指標不能複製,只能轉移其控制權,利用release()和reset()函式,轉移之後,原來的指標就失效了。
記憶體洩漏定義:
1、new了乙個空間,但沒有delete;
2、動態記憶體不存在作用域的問題,但儲存其位址的指標變數是受作用域影響的,指標一般是區域性變數,在函式內部new以後沒有釋放,
那麼該區域的記憶體將始終不能為其他資料所使用,而指向該記憶體的指標是個區域性變數,當定義該指標的函式結束並且返回時,指標也就消失了,我們就再也找不到該塊中的記憶體區域,指向該記憶體區域的指標自動消失了。 計算機就再也找不到該區域的記憶體了,就好像是丟失了這塊記憶體一樣,這種情況被稱之為記憶體洩漏。
優點:
解決記憶體洩漏問題,智慧型指標在出棧時,都會自動釋放指標,而不用像使用普通指標那樣要考慮因為異常等原因沒有delete掉。
使用注意:
1、應絕對避免把auto_ptr放到容器中,(unique_ptr)auto_ptr拷貝賦值時是所有權轉移,而在容器中可能會產生臨時物件拷貝賦值,臨時物件獲得所有權之後就析構了釋放了物件。並且很難避免stl內部對容器中的元素實現賦值,這樣便會使容器中多個元素被置位null。
vector
>m_example//絕不能這樣做
2、auto_ptr的析構函式呼叫的是delete不是delete,所以不能使用智慧型指標陣列。
3、避免unique_ptr(auto_ptr)之間的賦值。
4、當將unique_ptr(auto_ptr)作為函式引數時,最好宣告為const auto_ptr&引用,避免所有權轉移,當函式返回值可以簡單的傳值。
auto ptr智慧型指標
1 class auto ptr 這個智慧型指標應該保證,無論在何種情形下,只要自己被摧毀,就一定連帶釋放其所指資源。而由於智慧型指標本身就是區域變數,所以無論是正常退出,還是異常退出,只要函式退出,它就一定會被銷毀。注意 auto ptr不允許使用一般指標慣用的賦值 assign 初始化方式。必須...
智慧型指標 AutoPtr
include include include using namespace std void func autoptr 析構函式來負責釋放 void test catch exception e autoptr 析構函式來負責釋放 private t ptr struct aa void fun...
stl智慧型指標auto ptr
感覺auto ptr還是存在一些不足的,效率十分低,而且丟失了一般指標方便常用的操作,如 等,auto ptr只過載了 這幾個操作符,所以使用很不方便。一 說明 int a null delete a do nothing 應此auto ptr的析構函式是這樣子的 auto ptr 二 auto p...