天天看點

【Effective C++】第三章 資源管理第三章、資源管理

目錄

第三章、資源管理

1、以對象管理資源

2、在資源管理類中小心coping行為

3、對原始資源的通路

4、成對使用new和delete時要采取相同形式

5、以獨立語句将newed對象置入智能指針

第三章、資源管理

1、以對象管理資源

  • 為防止資源洩露,請使用RAII(資源取得時機便是初始化時機)對象,它們在構造函數中獲得資源并在析構函數中釋放資源。
  • 兩個常被使用的RAII classes分别是shared_ptr和auto_ptr。

auto_ptr:被銷毀時會自動删除它所指之物,是以别讓多個auto__ptr同時指向同一個對象。為預防這個問題,若通過copy構造函數或copy assignment操作符複制它們,它們就會變成null,而複制所得的指針将取得資源的唯一擁有權。

pInv1=pInv2;  //pInv1指向對象,pInv2被設為null

注意:STL容器要求其元素發揮“正常的”複制行為,是以這些容器不得auto_ptr

2、在資源管理類中小心coping行為

      複制資源管理對象時,進行的是“深度拷貝”。當類中有指針變量時,需要注意指針拷貝問題,是淺拷貝,需要自己重寫拷貝構造函數和重載等号操作符。

即有指針時的淺拷貝和深拷貝問題。

3、對原始資源的通路

      shared_ptr和auto_ptr都提供一個get成員函數,用來執行顯示轉換,也就是它會傳回智能指針内部的原始指針。它們還重載了指針取值操作符(operator->和operator*),它們允許隐式轉換至底部原始指針。
  • APIs往往要求通路原始資源,是以每一個RAII class應該提供一個“取得其所管理之資源”的辦法。
  • 對原始資源的通路可能經由顯示轉換或隐式轉換。一般而言顯式轉換比較安全,但隐式轉換對客戶比較友善。

4、成對使用new和delete時要采取相同形式

即在new表達式中使用[],必須在相應的delete表達式中也使用[]。如果new表達式中不使用[],一定不要在相應的delete表達式中使用[]。 

new----------delete

new [ ]----------delete [ ]

5、以獨立語句将newed對象置入智能指針

processWidget(std::tr1::shared_ptr<Widget>(new Widget),priority());

可能執行順序:調用priority、執行new Widget、調用tr1::shared_ptr構造函數

或者:執行new Widget、調用priority、調用tr1::shared_ptr構造函數

若對priority的調用導緻異常,則new Widget傳回的指針将會遺失,則會引發資源洩露。解決辦法:(1)建立Widget,(2)将它置入一個智能指針内,然後再将那個智能指針傳入processWidget。

注意:以獨立語句将new對象存儲于智能指針内。 

繼續閱讀