【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...