c 智慧型指標介紹之auto ptr

2021-09-25 22:33:53 字數 2254 閱讀 2244

作用及特性:

智慧型指標的引用,主要是為了解決異常發生時產生記憶體洩漏。

auto_ptr在建立的時候獲取物件的所有權,在析構的時候,釋放物件記憶體空間(raii1

)。過載了函式的*->運算子,使得其操作看起來像個內建指標。

沒有使用引用計數,在複製構造或賦值的時候發生所有權轉移

包含的操作:

拷貝構造、賦值操作:

auto_ptr

(auto_ptr& __a)

throw()

:_m_ptr

(__a.

release()

) auto_ptr& operator=

(auto_ptr& __a)

throw()

reset/release/get

void

reset

(element_type* __p =0)

throw()

}element_type*

release()

throw()

element_type*

get(

)const

throw()

構造/析構:建構函式是explicit的,不能隱式轉換

explicit auto_ptr

(element_type* __p =0)

throw()

:_m_ptr

(__p)

// int *p = new int(1); auto_ptrap = p; 錯誤,不能隱式轉換

~auto_ptr()

缺點:

刪除方式,預設是delete,如果儲存的指標指向的是陣列,則應使用delete才能正確釋放

int

*arr = new int

[100];

auto_ptr<

int>

ap(arr)

;// 析構函式中刪除物件使用delete而不是delete,所以auto_ptr不能用來管理陣列指標

當對乙個auto_ptr執行拷貝構造和賦值運算時,物件所有權被轉移,再執行讀寫操作時會有問題;同時對於原始指標不能再做釋放操作

int

*p = new int(1

);auto_ptr<

int>

ap(p)

;auto_ptr<

int> ap2 = ap;

*ap =3;

// 錯誤,物件所有權已經轉移

不能講auto_ptr物件儲存在容器中,因為auto_ptr經過拷貝、賦值操作後,會修改原來auto_ptr物件。

vectorint>> vx; 

auto_ptr<

int>ap(

newint(3

));vc.

push_back

(ap)

;// 原來ap的記憶體權釋放給vc,後面在操作ap非法

應該避免多個auto_ptr指向同乙個原始指標,這樣會重複析構

int

*p = new int(1

);auto_ptr<

int>

ap1(p)

;auto_ptr<

int>

ap2(p)

;// 析構的時候會重複delete p

不能儲存棧型別,因為auto_ptr析構時通過堆記憶體方式釋放

int a = 2; auto_ptrap(&a); // ap析構是發生錯誤

備註:1. auto_ptr能作為函式返回值嗎?

可以, auto_ptr支援拷貝構造和賦值操作,函式返回時通常會發生拷貝構造操作。

auto_ptr<

int>

getageint()

resource acquisition is initialization, 資源獲取即初始化,也就是說,在控制資源生命週期的時候,在某個物件初始化(構造)的時候獲取資源,而在物件銷毀的時候析構。 ↩︎

智慧型指標auto ptr介紹

我們大家都知道,new一定要和delete配合使用,但是有一種情況可能會使這種配對失效,如下程式 include using namespace std class normal pointer example normal pointer example class normal pointer ...

C 智慧型指標之auto ptr

c 中指標申請和釋放記憶體通常採用的方式是new和delete。然而標準c 中還有乙個強大的模版類就是auto ptr,它可以在你不用的時候自動幫你釋放記憶體。下面簡單說一下用法。cpp view plain copy 用法一 std auto ptrm example new myclass 用法...

C 智慧型指標 auto ptr

智慧型指標 auto ptr vc版本 擁有權管理和轉移 當乙個智慧型指標給另乙個智慧型指標初始化的時候,兩個智慧型指標將會同時指向乙個空間,這樣在物件析構的時候,會導致一塊空間釋放多次的問題,所以乙個物件從始至終只能擁有乙個智慧型指標,這樣就保證不會乙個物件多次釋放的問題.我們讓指標給指標初始化的...