Effective C++ 小笔记:条款13-17(第三章)
? 常用的資源有:內(nèi)存、文件描述器(file descriptor)、互斥鎖(mutex locks)、圖形界面中的字體和筆刷、數(shù)據(jù)庫(kù)連接、以及網(wǎng)絡(luò)sockets。這些資源一般動(dòng)態(tài)創(chuàng)建和分配,也就是一個(gè)指針。不論哪一種資源,重要的是,當(dāng)你不再使用時(shí),必須將它還給系統(tǒng)。
?
條款13:以對(duì)象管理資源
把資源放進(jìn)對(duì)象里,我們便可以依賴C++的 析構(gòu)函數(shù) 自動(dòng)調(diào)用機(jī)制,確保資源被釋放。對(duì)象在作用域結(jié)束時(shí),其析構(gòu)函數(shù)自動(dòng)對(duì)其所指資源(對(duì)象)的指針調(diào)用delete。?
C++提供了2種用于管理資源的類,“智能指針” std::auto_ptr,和 “引用計(jì)數(shù)型智能指針” ?std::tr1::shared_ptr。它們叫做智能指針,但本質(zhì)是pointer-like對(duì)象,成員變量是表征資源的指針。二者使用方法一樣:
?1?class?Investment?{?...?};?2?Investment*?createInvestment();?
?3?
?4?void?f()
?5?{
?6?????...
?7?????std::tr1::shared_ptr<Investment>?pInv1(createInvestment());???????
?8?????????????????????????//?pInv1?points?to?the?object?returned?from?createInvestment
?9?????std::tr1::shared_ptr<Investment>?pInv2(pInv1);????
10?????????????????????????//?both?pInv1?and?pInv2?now?point?to?the?object
11??????????????????????????????????
12?????pInv1?=?pInv2;??????//OK????????????????????
13?????...
14?}
?
? auto_ptr不讓多個(gè)auto_ptr同時(shí)指向同一個(gè)對(duì)象。如果真的那樣,對(duì)象會(huì)被刪除一次以上,而那會(huì)導(dǎo)致“未定義行為”。為了預(yù)防這個(gè)問題,auto_ptr有一個(gè)不尋常的性質(zhì): 若通過copy構(gòu)造函數(shù)或copy assignment操作符復(fù)制它們,它們會(huì)變成null,而復(fù)制所得的指針將取得資源的唯一擁有權(quán)。還記得嗎,STL容器要求其存儲(chǔ)的元素具有正常的復(fù)制行為,因此這些容器容不得auto_ptr。
shared_ptr具有正常的復(fù)制行為。可存儲(chǔ)于STL容器。
兩者在析構(gòu)函數(shù)內(nèi)都對(duì)資源指針執(zhí)行delete,而不是delete[]。所以動(dòng)態(tài)分配的數(shù)組用它們管理是個(gè)餿主意。vector和string幾乎總是可以取代動(dòng)態(tài)分配得到的數(shù)組。
? 兩者有一個(gè)共同的名字,RAII對(duì)象。為防止資源泄露,請(qǐng)使用RAII對(duì)象。它們?cè)跇?gòu)造函數(shù)中獲得資源,并在析構(gòu)函數(shù)中釋放資源。通常,我們選擇shared_ptr,因?yàn)槠鋸?fù)制行為正常、直觀。而auto_ptr復(fù)制動(dòng)作會(huì)使他指向NULL。
兩外,tr1::shared_ptr 允許當(dāng)智能指針被建立起來時(shí)制定一個(gè)資源釋放函數(shù)(所謂刪除器,"deleter")綁定于智能指針身上(auto_ptr 就沒有這個(gè)能耐)。當(dāng)引用次數(shù)為0時(shí)候,刪除器 被調(diào)用。?
tr1::shared_ptr 支持定制型刪除器。可以被用于自動(dòng)解除互斥鎖(mutexes, 見條款14)等等。?
?
條款17:以獨(dú)立語句將newed 對(duì)象置入智能指針
1?processWidget(std::tr1::shared_ptr<Widget>(new?Widget),?priority()); ??//非獨(dú)立語句2?std::tr1::shared_ptr<Widget>?pw(new?Widget);???? //獨(dú)立語句
3?processWidget(pw,?priority());
?
? 1行中,編譯器要執(zhí)行三個(gè)操作。其中兩個(gè)參數(shù)的計(jì)算次序編譯器先做什么是有彈性的。如果如果priority函數(shù)在new之后執(zhí)行,并且函數(shù)出現(xiàn)異常,新生成的Widget對(duì)象將未置入智能指針,資源產(chǎn)生泄漏。2、3行則解決了這個(gè)問題。
轉(zhuǎn)載于:https://www.cnblogs.com/younes/archive/2010/03/08/1681074.html
總結(jié)
以上是生活随笔為你收集整理的Effective C++ 小笔记:条款13-17(第三章)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 需要学习人员的悲剧
- 下一篇: 通过UDP的组播方式收发数据