C Primer讀書筆記(十三)

2021-05-27 07:50:19 字數 1522 閱讀 4929

auto_ptr類模板:

auto_ptr物件只能儲存乙個指向物件的指標,並且不能用於指向動態分配的陣列,使用auto_ptr物件指向動態分配的陣列會導致未定義的執行時行為

1、auto_ptr 可以用於為異常安全進行記憶體分配

2、auto_ptr可以儲存任何型別指標的模板

auto_ptrp(new int(42));

auto_ptrp(new string("tianqi"));

3、因為auto_ptr的複製和賦值操作是具有破壞性的,所以不能將之儲存在標準容器中。標準容器庫的容器類要求在複製和賦值的之後兩個物件相等,auto_ptr不滿足這一要求。如果ap2賦給ap1,則賦值之後ap1 != ap2

4、auto_ptr的預設建構函式

如果不給定初始式,auto_ptr物件是未繫結的,它不指向任何物件。

auto_ptrp_auto;

預設情況下,auto_ptr的內部指標值置為0,對未繫結的auto_ptr物件解引用,其效果與未繫結的指標解引用相同。

*p_auto = 1024;

5、測試auto_ptr物件

//error:cannot use an auto_ptr as a condition

if(p_auto)

*p_auto = 1024;

//revised test guarantee p_auto an object

if(p_auto.get())

*p_auto = 1024;

ps:應該只用get詢問auto_ptr物件或者使用返回的指標值,不能用get作為建立其他auto_ptr物件的實參

使用get成員初始化其他auto_ptr物件違反auto_ptr類設計原則:在任意時刻只有乙個auto_ptr物件儲存給定指標,如果兩個auto_ptr物件儲存相同的指標,該指標就會被delete兩次。

6、auto_ptr物件與內建指標的另一區別是,不能直接將乙個位址賦給auto_ptr物件:

p_auto = new int(42);

相反必須用reset函式來該改變指標:

if (p_auto.get())

else

auto_ptr類模板為處理動態分配的記憶體提供了安全性和便利性的尺度。但是使用auto_ptr存在以下限制:

1、不要使用auto_ptr物件儲存靜態分配物件的指標,否則當auto_ptr物件本身被撤銷的時候,它將試圖刪除指向非動態分配物件的指標,導致未定義行為。

2、永遠不要使用兩個auto_ptr物件指向同乙個物件,導致這個錯誤的一種明顯的方式是,使用同乙個指標來初始化或者reser兩個不同的auto_ptr物件,另一種導致這個錯誤的微妙方式可能是,使用乙個auto_ptr物件的get函式的結果來初始化或者reset另乙個auto_ ptr物件

3、不要使用auto_pttr物件儲存指向動態分配陣列的指標,當auto_ptr物件被刪除的時候,它只釋放乙個物件--它使用普通delete操作符,而不同陣列的delete【】操作符。

4、不要將auto_ptr物件儲存在容器中,因為auto_ptr賦值和複製操作具有破壞性。

C primer 讀書筆記

第2 章 變數和基本型別 1 變數直接初始化和變數 複製初始化 int ival 1024 direct initialization int ival 1024 copy initialization 初始化不是賦值 2 內建型別復 制初始化和直接初始化幾乎沒有區別 但 對類型別物件來 說,有些初...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...