資源管理,一旦用了,就必須將其還給系統。資源包括動態記憶體分配,檔案描述器,互斥鎖,圖形介面的字型,筆刷,資料庫連線,網路sockets。
遇到的問題:
voidf(
)
在上述**中,在heap上申請記憶體空間,然後經過「…」,然後使用delete釋放申請的記憶體空間。
但是,在"…"的執行過程中,可能會存在return,丟擲異常,或者發生在對createinvestment的使用及delete動作位於某個迴圈內,而該迴圈由於某個continue或goto語句過早退出。上述情況,使得delete語句不會執行,從而倒是記憶體洩漏。
解決方法:
將資源放入物件內,根據c++的析構函式自動呼叫機制確保資源被釋放。
使用智慧型指標,shared_ptr對其進行管理,shared_ptr使用引用計數功能,當引用為0時,會自動釋放申請的記憶體空間。
對於陣列型別,使用c11中的array或者vector等stl的容器,他們不需要手動釋放記憶體空間。
std::shared_ptr
createinvestment()
voidf(
)
遇到的問題:
並非所有的資源都是在heap上的,有時候需要建立自己的資源管理類。
class lock
~lock()
private:
mutex *mutexptr;
};
上面的**是將互斥鎖的函式進行了封裝,我們只要建立物件,則在這個**塊中從這個物件建立起,將成為臨界區。在脫離這個**塊時,將自動解鎖。這個類遵循raii原則,也就是」資源在構造期間獲得,在析構期間釋放「。
這裡有幾個問題:
當乙個raii物件被複製,會發生什麼?
lock ml1(&m);
lock ml2(ml1);
禁止複製行為。
使用引用計數法。在類中使用shared_ptr對申請的記憶體空間進行管理。
class
lock
private
: std::shared_ptr mutexptr;
};
Effective C 3 資源管理
problem void f solution.1 使用auto ptr智慧型指標確保資源的釋放,避免記憶體洩露 void f key points 以物件管理資源 的兩個關鍵想法 1.獲得資源後立刻放進管理物件內 如auto ptr 2.管理物件運用析構函式確保資源被釋放 attention au...
Effective C 筆記 3 資源管理
class investment investment createinvestment 返回指標,指向investment繼承體系內的動態分配單元void f 把資源放入物件內,便可依賴c 的析構函式自動呼叫機制確保資源被釋放 許多資源被動態分配與堆中,而後被用於單一區塊或函式內,他們應該在控制流...
《Effective C 》資源管理章節
item 13 以物件管理資源 關鍵的兩個想法 這種方式其實在很多地方都可以看出影子,比如managing pool的模型 1.獲得資源後立刻放入管理物件 managing object 以物件管理資源的觀念常常被稱為 資源取得之時就是初始化時機 resourece acquisition is i...