auto ptr使用總結

2021-06-27 05:29:20 字數 1843 閱讀 7165



(1) auto_ptr的意義

auto_ptr是一種智慧型指標,當系統異常退出的時候避免資源洩漏(記憶體)。

其他的資源還對應其他的智慧型指標。

(2) auto_ptr的使用

std::auto_ptrtest(new int(1));

test將是乙個auto_ptr的物件,使用乙個int指標進行初始化。

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

當使用auto_ptr的時候,必須使用顯式的型別轉化來初始化,如auto_ptra(new classa),而不能使用auto_ptra = new classa;

(3) auto_ptr所有權的轉移

auto_ptr對所有權有嚴格的約定,乙個auto_ptr只能控制乙個指標,不能控制多個,當auto_ptr擁有乙個指標的時候就不能在擁有其他的指標了。同時,不同的auto_ptr不能擁有同乙個指標。但是存在這樣的情況,不同的auto_ptr可能控制著相同的物件,不要出現這樣的情況。

auto_ptra(new int); 1

auto_ptrb(a); 2

auto_ptrc = b; 3

auto_ptrd(int); 4

d = c; 5

當2發生的時候,a將所有權放棄,b獲得所有權。

當3發生時, b將放棄所有權,c獲得所有權。

當5發生時, c的所有權給d,d將釋放自己的所有權,並把物件刪除掉。

(4) 作為引數會改變作用域

當auto_ptr以引數的形式傳遞給函式的時候,作用域同樣發生了變化,從之前的作用域變成了函式內部的作用域。過程時這樣的,當有auto_ptr作為引數傳遞到函式內部的時候,首先會交接自己的所有權,所有權交給了函式的引數,作用域變成了函式的內部。函式退出時,函式內部的臨時變數都會離開作用域,包括傳遞進來接收到的auto_ptr,auto_ptr會釋放自己儲存的資源。在函式退出後,申請的資源就消失了,這種情況可能很出乎人的預料,因為c++一般傳遞引數都是傳值,如何都不會改變變數本身的作用域的。

(6)在函式內部返回乙個指標,可以避免記憶體洩漏

#include

using namespace std;

template

auto_ptrgetautoptr()

int main(void)

(5)作為引數時,不要傳遞引用

函式的引數可以是auto_ptr& 型別,當傳遞auto_ptr的引用的時候,有的時候會傳遞所有權,有的時候不會,所以永遠不要這樣做。

(6)const auto_ptr& 實現的是不需要傳遞所有權。這個特性主要應用在模板上,當使用auto_ptr例項化物件的時候不會出現問題。所以const auto_ptr&的意思是不能轉移所有權,而不是不能更改資料,這裡和c++資訊是不一樣的,還是少使用好一些。

auto_ptr當作類的成員變數可以避免,當類在構造的時候出現異常,這樣如果記憶體被分配了是不會被釋放的,因為如果構造沒有完成是不會呼叫析構函式的,這個時候就沒有辦法來釋放申請的資源了。可以使用auto_ptr來避免這樣的事情發生,如果不想在類種轉換所有權,可以使用const來修飾。

(7) 使用auto_ptr的誤區

1 兩auto_ptr不要引用同乙個物件(t*),這樣如果乙個auto_ptr釋放了資源,另乙個或多個就無法獲得引用物件的資訊。

2 auto_ptr不可以儲存array,因為在釋放的時候是使用delete,這樣就會引起未知的問題。

3 auto_ptr設計成在異常發生的時候避免記憶體洩漏,不要亂用。

4 不要在容器中使用auto_ptr,因為無法滿足容器的一些要求,比如在copy construct和 「=」操作時,會轉移所有權。

AUTO PTR使用總結

標準auto ptr智慧型指標機制很多人都知道,但很少使用它。這真是個遺憾,因為auto ptr優雅地解決了c 設計和編碼中常見的問題,正確地使用它可以生成健壯的 本文闡述了如何正確運用auto ptr來讓你的 更加安全 以及如何避免對auto ptr危險但常見的誤用,這些誤用會引發間斷性發作 難以...

auto ptr使用總結

1 auto ptr的意義 auto ptr是一種智慧型指標,當系統異常退出的時候避免資源洩漏 記憶體 其他的資源還對應其他的智慧型指標。2 auto ptr的使用 std auto ptrtest new int 1 test將是乙個auto ptr的物件,使用乙個int指標進行初始化。test可...

經驗總結 auto ptr使用小結

注意點 1 不能用auto ptr管理陣列指標 析構時用delete p方式釋放 2 缺少引用計數機制。賦值和拷貝時,原始的auto ptr被釋放 pointee變為null 3 一塊記憶體不能同時被兩個auto ptr管理,否則會出現記憶體重複釋放的問題。實現要點 1 過載訪問符號 和 templ...