讀書筆記_Effective C++_資源管理

來源:互聯網
上載者:User

標籤:

這個章節主要講的是資源管理相關的知識,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++_資源管理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.