條款13:以物件管理資源
資源包括:動態分配記憶體、檔案描述符、網路socket、互斥鎖、資料庫連線
把資源放進物件內,可以依賴c++的"析構函式自動呼叫機制"確保資源被釋放
智慧型指標: 是乙個"類指標"物件,引用計數型指標,當引用物件數為0時,自動刪除該資源
std::shared_ptrpclass(new class);
每一筆資源都在獲得的同時立刻被放進管理物件中
條款14:在資源管理類小心copy行為
raii:資源獲取即初始化,資源在建構函式期間獲得,析構函式期間釋放
classlock
~lock()
private
: mutex*mutexptr;
};
當乙個raii物件被複製時:
a.禁止複製:將copy函式宣告為 private 且只宣告不實現
b.引用計數:std::shared_ptr
shared_ptr 允許指定所謂的"刪除器"(乙個函式或函式物件),當引用計數為0時便被自動呼叫
classlock
private
: std::shared_ptr
mutexptr;
};
c.複製底部資源,深度拷貝
d.慎用:auto_ptr,轉移底部資源的擁有權,資源的擁有權會從被複製物件轉移到目標物件
條款15:在資源管理類中提供對原始資源的訪問
std::shared_ptrpclass(new class);
現在某個函式要求訪問原始資源:
int func(const class *pclass);
如果我們呼叫:int result = func(pclass);
此時錯誤,因為func函式需要的是 class* 指標(原始指標),而不是std::shared_ptr
shared_ptr提供乙個get成員函式,用來執行顯式轉換,會返回智慧型指標內部的原始指標(的拷貝)
條款16:成對使用 new 和 delete 時要採用相同形式
如果 delete 加上中括號,delete 便認定指標指向乙個陣列,否則認定指標指向單一物件
string* stringptr1 = newstring
;string* stringptr2 = new
string[100
];delete stringptr1;
//刪除單一物件
delete stringptr2; //
刪除由物件組成的陣列
條款17:以獨立語句將newed物件置入智慧型指標
int func(std::shared_ptr(new widget), func1());
在呼叫func之前,編譯器必須建立**,做一下三件事:
1.呼叫func1()
2.執行 new widget
3.呼叫shared_ptr的建構函式
c++編譯器並未指定這3件事的執行次序
如果編譯器按 2--->1--->3 的次序執行
當執行func1出現異常時, new widget返回的指標並未成功置入 shared_ptr內,可能引發資源洩露
解決方法:以單獨語句將newed物件置入智慧型指標內
std::shared_ptrpw(newwidget);
func(pw, func1());
Eclipse資源管理(三)
關於marker的使用 描述 在eclipse中marker是用來 級別的各種狀態資訊的乙個框架,使用marker可以輕鬆的瀏覽和定位檔案中的錯誤或其他的一些資訊。1.定義marker,在eclipse中已經定義了一些marker,但是在我們使用的時候,也有可能需要定義自己marker。如下是ecl...
SSH(三)資源分類和日誌管理
上篇博文已經分別介紹了如何搭建 ssh開發環境以及對 ssh三個框架的整合。整合完成之後,我們基本上就可以正常的開始乙個基於 ssh框架開發的專案了。本篇博文介紹的資源分類和日誌管理都是一些錦上添花的配置。利用這些,來清晰我們的思路,便利我們的程式設計。先來說說資源分類吧。這裡的資源分類是指對專案中...
Effective C 筆記 3 資源管理
class investment investment createinvestment 返回指標,指向investment繼承體系內的動態分配單元void f 把資源放入物件內,便可依賴c 的析構函式自動呼叫機制確保資源被釋放 許多資源被動態分配與堆中,而後被用於單一區塊或函式內,他們應該在控制流...