Effective C 3 資源管理

2021-09-17 19:10:27 字數 3018 閱讀 1107

【problem】

void f()

【solution. 1】

使用auto_ptr智慧型指標確保資源的釋放,避免記憶體洩露

void f()
【key points】

「以物件管理資源」的兩個關鍵想法:

1. 獲得資源後立刻放進管理物件內(如auto_ptr)

2. 管理物件運用析構函式確保資源被釋放

【attention】

auto_ptr的限制,舉例:

std::auto_ptrpinv1(createinvestment()); //pinv1指向createinvestment()返回值;

std::auto_ptrpinv2(pinv1); //pinv2指向物件,而pinv1被設為null;

pinv1 = pinv2; //pinv1指向物件,而pin2被設為null;

受auto_ptr管理的資源必須絕對沒有乙個以上的auto_ptr同時指向它。

stl容器要求其元素發揮正常的複製行為,因此這些容器容不得auto_ptr。

【solution.2】

使用share_ptr智慧型指標(引用計數型智慧型指標)

void f()

//函式退出,pinv1,pinv2被銷毀,它們所指的物件也竟被自動釋放。

【attention】

1. auto_ptr和tr1::share_ptr 兩者都是在其析構函式內做delete而不是delete;意味著在動態分配的array身上使用兩者是個壞主意。

2. share_ptr不能管理迴圈引用的物件,否則造成記憶體洩露,舉例:

class parent;

class child;

typedef boost::shared_ptrparent_ptr;

typedef boost::shared_ptrchild_ptr;

class parent

解決方法:

1. 當parent的生存期超過childr的生存期的時候,child內改為使用乙個普通指標指向parent。

2. 使用弱引用的智慧型指標打破這種迴圈引用。舉例:

暫略
【attention】

1. 複製raii物件必須一併複製它所管理的資源,所以資源的copying行為決定raii物件的copying行為

2. 普遍而常見的raii類拷貝行為是:抑制拷貝,施行引用計數法。不過其它行為也可能被實現

【solution】

「當乙個raii物件被複製,會發生什麼事?」大多數時候你會選擇一下兩種可能:

1. 禁止複製。如果複製動作對raii類並不合理,你便應該禁止之。利用條款6(禁止類的copying函式)。

2. 對底層資源使用」引用計數法「。有時候我們又希望保有資源,直到它的最後乙個使用者被銷毀。 利用shared_ptr

3. 轉移底部資源的擁有權。 利用auto_ptr

4. 複製底部資源。 利用深拷貝

``【problem】

需要乙個函式可將raii物件(shared_ptr)轉換為其所內含之原始資源.

【solution】

有兩種做法可以達成目標:

1. 顯示轉換

shared_ptr和auto_ptr提供乙個get成員函式,用來執行顯示轉換,也就是返回智慧型指標內部的原始指標。

shared_ptr和auto_ptr過載指標取值操作符(operator->和operator*),它們允許隱式轉換至底部原始指標。

(即在對智慧型指標物件實施->和*操作時,實際被轉換為被封裝的資源的指標。)

2. 隱式轉換

隱式轉換可能引起「非故意之型別轉換」

raii class 設計方式

class font

operator fonthandle() const//隱式轉換這個值得注意,可能引起「非故意之型別轉換」

private:

fonthandle f; // 資源

...};

盡量使用顯示轉換,減少出錯的可能

如果你在new表示式中使用,必須在相應的delete表示式中也使用。

如果你在new表示式中不使用,一定不要在相應的delete表示式中使用。

Effective C 筆記 3 資源管理

class investment investment createinvestment 返回指標,指向investment繼承體系內的動態分配單元void f 把資源放入物件內,便可依賴c 的析構函式自動呼叫機制確保資源被釋放 許多資源被動態分配與堆中,而後被用於單一區塊或函式內,他們應該在控制流...

Effective C 總結 3 資源管理

資源管理,一旦用了,就必須將其還給系統。資源包括動態記憶體分配,檔案描述器,互斥鎖,圖形介面的字型,筆刷,資料庫連線,網路sockets。遇到的問題 voidf 在上述 中,在heap上申請記憶體空間,然後經過 然後使用delete釋放申請的記憶體空間。但是,在 的執行過程中,可能會存在return...

《Effective C 》資源管理章節

item 13 以物件管理資源 關鍵的兩個想法 這種方式其實在很多地方都可以看出影子,比如managing pool的模型 1.獲得資源後立刻放入管理物件 managing object 以物件管理資源的觀念常常被稱為 資源取得之時就是初始化時機 resourece acquisition is i...