天天看點

條款13:以對象管理資源

對于這樣的一個函數:

void f()

{

    int *pi = create();        //create函數傳回一個指向動态配置設定的整形變量指針

    。。。。。。。。。。

    delete pi;

}

        如果中間程式過早出現return語句,那麼動态記憶體沒有及時釋放掉,産生了記憶體洩露;右或者是中間程式的語句抛出異常,也不會執行delete語句;再或者delete語句在一個循環或者switch語句中執行了break、continue(隻有循環語句)都會跳過delete語句。

       為了確定動态申請的資源總被釋放,需要将資源放進對象對,利用對象的構造函數接管這片資源,利用析構函數釋放這片資源。于是就有了“智能指針”:類指針對象auto_ptr

void f()

{

    std::auto_pt<int> pi( create() );

    。。。。。。。。。。。

}

       這樣pi對象的構造函數裡接管了create函數裡面配置設定的動态記憶體,無論控制流如何退出f函數,都會調用對象的析構函數銷毀這片動态記憶體。

       但是,這裡不能讓多個auto_ptr同時指向同一個對象。否則會造成未定義行為。于是C++中對其做了限制:若通過copy構造函數或指派操作符複制它們,它們會變成null,而複制所得的指針将取得資源的唯一擁有權。

     auto_ptr的替代方案是“引用計數型智能指針”RCSP。即持續追蹤共有多少對象指向某個資源,并在無人指向它時自動删除該資源。

        但是在程式設計時最好在哪裡申請記憶體就在哪裡釋放,因為在使用者不知道create函數傳回的是動态申請的記憶體,可能不會使用智能指針等機制確定記憶體釋放。