Effective C++ -- 資源管理

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);




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章