作用及特性:
智慧型指標的引用,主要是為了解決異常發生時產生記憶體洩漏。
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版本 擁有權管理和轉移 當乙個智慧型指標給另乙個智慧型指標初始化的時候,兩個智慧型指標將會同時指向乙個空間,這樣在物件析構的時候,會導致一塊空間釋放多次的問題,所以乙個物件從始至終只能擁有乙個智慧型指標,這樣就保證不會乙個物件多次釋放的問題.我們讓指標給指標初始化的...