13.以對象管理資源
void f()
{
Investment* pInv = createInvestment();
...
delete pInv;
}
- 以上代碼存在問題:在delete之前出現異常,導致pInv無法刪除,造成資源泄露。
- 解決方法:RAII Resource Acquisition Is Initialization 資源獲取時機即初始化
使用智能指針,代碼如下:
void f()
{
auto_ptr<Investment> pInv(createInvestment());
}
14.在資源管理類中小心copying行爲
當一個RAII對象被複制,一般選擇以下可能。
- 禁止賦值
- 對底層資源進行引用計數
- 複製底層資源
- 轉移底層資源擁有權
share_ptr允許指定刪除器
15.在資源管理類中提供對原始資源的訪問
auto_ptr,share_ptr提供了get函數獲取原始資源。
自定義RAII時,可以使用顯示轉換和隱式轉換兩種方式。
隱式轉換:operator FontHandle() const {return f;}
16.成對使用new和delete時要採用相同的形式
new使用delete
new []使用delete []
new []的內存模型可能會是:數組個數+各個數組元素。不成對使用會引起未定義的行爲。
對new []調用delete可能會引起其他對象未被析構。
typedef使用注意事項,不要定義數組
17.以獨立語句將newed對象置入智能指針
int priority();
void processWidget(shared_ptr<Widget> pw, int priority);
processWidget(shrare_ptr<Widget>(new Widget), priority());
以上代碼問題如下:
可能的執行順序有
執行new Widget
調用priority
調用share_ptr
如果priority調用異常,導致new Widget資源泄露。
解決方法如下:
share_ptr<Widget> pw(new Widget);
processWidget(pw, priority);