標籤:
這個章節主要講的是資源管理相關的知識,C++程式中最常使用的資源就是動態分配記憶體,但記憶體只是必須管理的眾多資源之一,其他常見的資源還有檔案描述器、互斥鎖、圖形介面的字型和筆刷、資料庫連接、以及網路sockets。無論是哪一種資源,重要的是,當你不再使用它時,必須將它還給系統。
條款十三
Investment* createInvestment(); //返回指標,指向Investment繼承體系內的動態指派至,調用者有責任刪除它
通常調用這種factory函數,都需要在恰當的時候釋放了pInv所指對象。
void f(){ Investment* pInv = createInvestment(); ... delete pInv;}
當很多意外的情況就會導致pInv無法釋放,為了確保這一點,需要將資源放進對象中,當控制流程離開f,該對象的解構函式會自動釋放那些資源(把資源放進對象內,可以依賴C++的解構函式確保資源被釋放)。
void f(){ std::auto_ptr<Investment> pInv(createInvestment()); ...}
以對象管理資源的關鍵:
(1)獲得資源後立刻放進管理對象內;
(2)管理對象運用解構函式確保資源被釋放。
auto_ptr被銷毀的時候會自動銷毀所指的對象,所以應該要注意別讓多個auto_ptr同時指向同一個對象。為了預防這個問題,auto_ptrs有一個不尋常的性質:若通過copy建構函式或copy assignment操作符複製它們,它們就會變成null,而複製所得的指標將獲得資源的唯一擁有權。
std::auto_ptr<Investment> pInv1(createInvestment());std::auto_ptr<Investment> pInv2(pInv1); // 現在pInv2指向對象,pIn1被設為nullpInv1 = pInv2; // 現在pInv1指向對象,pInv2被設為null
受auto_ptrs管理的資源必須絕對沒有一個以上的auto_ptr同時指向它,這樣的話STL容器就不能存放auto_ptr(STL容器要求其元素髮揮正常的複製行為)。
而TR1的tr1::shared_ptr就是個RCSP:
void f(){ ... std::tr1::shared_ptr<Investment> pInv1(createInvestment()); std::tr1::shared_ptr<Investment> pInv2(pInv1); // pInv1和pInv2指向同一個對象 pInv1(pInv2); // 同理 pInv1 = pInv2; // 同理 ...}
所以tr1::shared_ptrs可被用於STL容器等語境上。
auto_ptr和tr1::shared_ptr兩者都在其解構函式內做delete而不是delete[]動作,意味著動態分配而得的array是無法使用的。一般對於動態分配數組都是使用vector和string,當然使用了Boost程式庫的話,可以用boost::scoped_array和boost::shared_array。
持續更新…
讀書筆記_Effective C++_資源管理