程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Effective C++ Item 13

Effective C++ Item 13

編輯:關於C++

Item 13-以對象管理資源(Use objects to manage resources)

半邊想法:把資源放進對象內,我們便可依賴C++的"析構函數自動調用機制"確保資源被釋放。

許多資源被動態分配與heap內而後被用於單一區域或函數內。它們應該在控制流離開那個區域或函數時被釋放。標准程序庫提供的auto_ptr正是針對這種形勢而設計的特質產品。auto_ptr是個"類指針(pointer-like)對象"也就是所謂"智能指針",其析構函數自動對其所指對象調用detele。

Ex:

class Investment{...};            //"投資類型"繼承體系中的root class
Investment* createInvestment();   //返回指針,指向Investment繼承體系內的動態分配對象。調用者有責任刪除它。
void f()
{
    std::auto_ptr pInv(createInvestment());
    ...
}                                 //經由auto_ptr的析構函數自動刪除pInv

 

兩個關鍵想法:

1、獲得資源後立刻放進管理對象內(managing object)內。

f()中,createInvestment返回的資源被當做其管理者auto_ptr的初值。實際上"以對象管理資源"的觀念常被稱為"資源取得時機便是初始化時機"(Resource Acquisition Is Initialization; RAII),因為我們幾乎總是在獲得的資源被拿來賦值(而非初始化)某個管理對象,但不論哪一種做法,每一筆資源都在獲得的同時立刻被放進管理對象中。

2、管理對象(managing object)運用析構函數確保資源被釋放。

由於auto_ptr被銷毀時會自動刪除它所指之物,所以一定要注意別讓多個auto_ptr同時指向同一個對象。不然對象就會刪除一次以上。

所以auto_ptr有一個不尋常的性質:若通過copy構造函數或copy assignment操作符復制它們,它們會變成NULL,而復制所得的指針將取得資源的唯一擁有權。

所以,auto_ptr並不是最佳方案。
替代方案"引用計數型智慧指針"(reference-counting smart pointer; RCSP)。RCSP也是個智能指針,持續追蹤共有多少對象指向某筆資源,並在無人指向它們時自動刪除該資源。

Ex:

void f()
{
    ...
    std::trl::shared_ptr
    pInv1(createInvestment());   //pInv指向createInvestment返回物理=
    std::trl::shared_ptr
    pInv2(pInv1);                //pInv1和pInv2指向同一個對象
    pInv1=pInv2;
    ...
}                                //pInv1和pInv2都被銷毀

請記住:

為防止資源洩漏,請使用RAII對象,它們在構造函數中獲得資源並在析構函數中釋放資源。

兩個常被使用的RAII classes分別是trl::shared_ptr和auto_ptr。前者是較佳選擇,因為其copy行為比較直觀。若選擇auto_ptr,復制動作會使它(被復制物)指向NULL。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved