資源:用了就必須還給系統的;
如動態分配的記憶體、檔案描述符、互斥鎖、網路socket等;
void f()
上面是用delete刪除指定的,但如果在f函式中有多處進行return或是丟擲異常等行為,則不會執行到delete,因此造成記憶體洩露;
為此我們可以將申請的資源放進物件內,當控制流離開f時會自動呼叫析構函式釋放資源;
方法:
1. 智慧型指標 std::auto_ptr
void f()
然而使用智慧型指標會存在乙個問題:每個物件只能由乙個指標指向它;
void f()
2. 引用計數智慧型指標tr1::shared_ptr
void f()
該指標不存在智慧型指標的不能指向同乙個物件的問題;
3、問題
析構函式內仍然只是呼叫delete,而沒有呼叫delete;因此對於陣列物件來說是不行的,如
tr1::shared_ptrpa(new a[10]);
並不是所有的資源都是基於堆的,對於那種資源,智慧型指標不適合,因此需要自己建立乙個類為管理資源;建構函式建立乙個資源,析構函式釋放資源;
如互斥物件:
class a
; ~a() ;
private:
mutex* pmutx;
};
void f()
//釋放互斥物件
}
建立乙個資源管理類,可以由多個指標指向同乙個物件,且必須在最後乙個指標撤消時才釋放記憶體,可以用tr1:shared_prt,但不能有複製建構函式;這可以用private基類來實現;同樣可以不用定義析構函式,因為智慧型指標會自動呼叫析構函式;
class a:public uncopy // 抑制複製建構函式;
private:
tr1::shared_ptrpmutx; // 計數智慧型指標
};
為資源管理類建立乙個獲得原始資源的介面!可以通過隱式型別轉換或是顯示函式呼叫的方式;
對於這種情況,經常可能會忘記使用 , 而造成沒有徹底析構物件;
因此可以使用stl的vector, string等模板來代替相應的陣列;
Effective 學習記錄
1.讓自己習慣c 2 盡量以const enum inline 替換 define 3 盡可能使用const 4 確定物件被使用前已經被初始化 2.構造 析構 賦值運算 5 了解c 默默編寫並呼叫哪些函式 建構函式 拷貝建構函式 賦值運算子 析構函式 6 若不想使用編譯器自動生成的函式,就應該明確拒...
efficient和effective的區別
efficient 高效的 effective 有效的 就是 高效的和有效的 這個區別 an efficient secretary 工作效率高的秘書 an effective medicine for hair loss 一種 脫髮的有效藥舉個栗子,從武漢到北京,有多種交通方式,例如飛機 高鐵 汽...
effective35 基礎議題
1.仔細區別pointers和references 2.最好使用c 轉型操作符 3.絕對不要以多台方式處理陣列 4.非必要補提供default construnctors 指標 這玩意相信大家都不陌生了.萬惡之源 引用 這是我在學了c 之後新接觸的東西,乍看很高階,其實底層的實現也就是乙個指標.vs...