C Primer 第十二章 智慧型指標和異常

2021-10-02 07:28:43 字數 1882 閱讀 7724

智慧型指標和異常

即時程式塊過早結束,智慧型指標類也能確保在記憶體不再需要時將其釋放

voidf(

)//在函式結束時shared_ptr自動釋放記憶體

與之對應的,當發生異常時,我們直接管理的記憶體是不會自動釋放的。如果使用內建指標管理記憶體,且在new之後在對應的delete之前發生了異常,則記憶體是不會被是釋放的。

voidf(

)

如果在new和delete之間發生異常,且異常未在f中**獲,則記憶體就永遠不會被是釋放了。在函式f之外沒有指標指向這塊記憶體

智慧型指標和啞類

假如,我們正在使用乙個c/c++都使用的網路庫,**如下:

struct destination;

//表示我們正在連線著什麼

struct connection;

//使用連線所需資訊

connection connect

(destination *);

//開啟連線

void

disconnect

(connection)

;//關閉給定連線

void

f(destination &d /*其他引數*/

)

對於這個問題,我們使用share_ptr來保證connection被正確關閉

當乙個shared_ptr被銷毀時,它預設地對它管理地指標進行delete操作。為了用shared_ptr來管理乙個connection,我們必須首先定義乙個函式來代替delete。這個刪除器函式必須能夠完成對shared_ptr中儲存的指標進行釋放操作。在本例中,我們的刪除器必須接受單個型別為connection*的引數。

void

end_connection

(connection *p)

當我們建立乙個shared_ptr時,可以傳遞乙個指向刪除器函式的引數

void

f(destination &d /*其他引數*/

)

當p被銷毀時,它不會對自己儲存的指標執行delete,而是呼叫end_connection。end_connection會呼叫disconnect,從而確保連線被關閉。如果發生了異常,p同樣會被銷毀,從而連線被關閉

編寫自己版本用shared_ptr管理connection的函式,並用lambda代替end_connection函式

#include

#include

using

namespace std;

struct destination

;struct connection

;connection connect

(destination* pd)

void

disconnect

(connection c)

//未使用shared_ptr的版本

void

f(destination& d)

void

end_connection

(connection* p)

//lambda不捕獲區域性變數,引數為connection指標,用改指標指向的物件呼叫disconnect即可

//(connection *p)

void

f1(destination& d)

);//忘記呼叫disconnect關閉連線

cout << endl;

}int

main()

C primer 第十二章筆記 初稿

區域性static物件,類的static資料成員及定義在函式之外的變數,都儲存在靜態記憶體中 函式內的非static物件儲存在棧中 動態分配的物件儲存在堆中 執行時分配記憶體 shared ptr 注 內建指標與智慧型指標不存在隱式轉換,必須直接初始化。當使用get 方法時,很容易產生釋放物件空間的...

c primer第十二章讀書筆記

本章主要講解new運算子在各種情況下的使用注意事項。c 使用new和delete運算子來動態控制記憶體。一 關於靜態成員 1 靜態成員屬於類,不屬於物件,即在多個物件中只有乙個靜態成員物件副本。2 靜態資料成員在類中宣告,在包含類方法的檔案中初始化。但如果靜態成員是const整型型別或者列舉型別,則...

第十二章 檔案

文字檔案 文字檔案是一種由若干字元構成的檔案,可以用文字編輯器進行閱讀或編輯。以txt py html等為字尾的檔案都是文字檔案。2.二進位制檔案 二進位制檔案一般是指不能用文字編輯器閱讀或編輯的檔案。以 mp4 png等為字尾的檔案都是二進位制檔案,如果想要開啟或修改這些檔案,必須通過特定軟體進行...