• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            春暖花開(kāi)
            雪化了,花開(kāi)了,春天來(lái)了
            posts - 149,comments - 125,trackbacks - 0
            摘自: http://www.shnenglu.com/yearner/archive/2008/11/09/66447.html

            對(duì)于智能指針,也只是聽(tīng)說(shuō)而已,對(duì)深層的東西也不甚了解。昨日又重聽(tīng)這一字眼,想想多少也該了解一些。

            淺談C++的智能指針

                    內(nèi)存泄露是C++程序員都頭疼的大問(wèn)題。C++缺乏像JAVA、C#一樣,擁有GC這么一項(xiàng)有利的武器,它將內(nèi)存管理的部分權(quán)限交給了程序員。雖然GC的存在節(jié)約了開(kāi)發(fā)、排錯(cuò)的時(shí)間與成本,但是C++為了追求運(yùn)行速度而20年來(lái)堅(jiān)決不予補(bǔ)充進(jìn)其標(biāo)準(zhǔn)。(題外話(huà):C++通過(guò)加大開(kāi)發(fā)難度去換取執(zhí)行速度的做法,在現(xiàn)在看來(lái)不知是否能給與正面的評(píng)價(jià),還是留給將來(lái)再說(shuō)吧。)

                   從此,在堆上申請(qǐng)了內(nèi)存忘了釋放、所造成的內(nèi)存泄露的問(wèn)題就一直困擾著C++程序員。也許為了稍許彌補(bǔ)沒(méi)有垃圾回收器所造成的開(kāi)發(fā)門(mén)檻高,各大廠商開(kāi)發(fā)的C++庫(kù)中都像COM學(xué)習(xí)引入智能指針試圖解決部分目前存在的問(wèn)題。

                   智能指針是存儲(chǔ)指向動(dòng)態(tài)分配(堆)對(duì)象指針的類(lèi), 用于生存期控制, 能夠確保自動(dòng)正確的銷(xiāo)毀動(dòng)態(tài)分配的對(duì)象,防止內(nèi)存泄露。它的一種通用實(shí)現(xiàn)技術(shù)是使用引用計(jì)數(shù)(reference count)。智能指針類(lèi)將一個(gè)計(jì)數(shù)器與類(lèi)指向的對(duì)象相關(guān)聯(lián),引用計(jì)數(shù)跟蹤該類(lèi)有多少個(gè)對(duì)象共享同一指針。每次創(chuàng)建類(lèi)的新對(duì)象時(shí),初始化指針并將引用計(jì)數(shù)置為1;當(dāng)對(duì)象作為另一對(duì)象的副本而創(chuàng)建時(shí),拷貝構(gòu)造函數(shù)拷貝指針并增加與之相應(yīng)的引用計(jì)數(shù);對(duì)一個(gè)對(duì)象進(jìn)行賦值時(shí),賦值操作符減少左操作數(shù)所指對(duì)象的引用計(jì)數(shù)(如果引用計(jì)數(shù)為減至0,則刪除對(duì)象),并增加右操作數(shù)所指對(duì)象的引用計(jì)數(shù);調(diào)用析構(gòu)函數(shù)時(shí),構(gòu)造函數(shù)減少引用計(jì)數(shù)(如果引用計(jì)數(shù)減至0,則刪除基礎(chǔ)對(duì)象)。

                    說(shuō)到智能指針,我們一定要看看標(biāo)準(zhǔn)C++庫(kù)提供的“搞笑的”智能指針:auto_ptr。

                   標(biāo)準(zhǔn)庫(kù)中提供了C++程序的基本設(shè)施。雖然C++標(biāo)準(zhǔn)庫(kù)隨著C++標(biāo)準(zhǔn)折騰了許多年,直到標(biāo)準(zhǔn)的出臺(tái)才正式定型,網(wǎng)上評(píng)論C++標(biāo)準(zhǔn)庫(kù)時(shí)都說(shuō):“在標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)上卻很令人欣慰得看到多種實(shí)現(xiàn),并且已被實(shí)踐證明為有工業(yè)級(jí)別強(qiáng)度的佳作。”但目前的標(biāo)準(zhǔn)C++中,只有一種獨(dú)苗智能指針:std::auto_ptr。

                    auto_ptr指針是一個(gè)RAII對(duì)象,它初始化時(shí)獲得資源,析構(gòu)時(shí)自動(dòng)釋放資源(生命期結(jié)束).它的缺點(diǎn)數(shù)不勝數(shù):
            1、auto_ptr要求一個(gè)對(duì)象只能有一個(gè)擁有者,嚴(yán)禁一物二主
            2、缺少對(duì)引用數(shù)和數(shù)組的支持。
            3、不可將auto_ptr對(duì)象作為STL容器的元素。C++標(biāo)準(zhǔn)明確禁止這樣做,否則可能會(huì)碰到不可預(yù)見(jiàn)的結(jié)果。(這一條暈死一大片)。
            4、auto_ptr在被復(fù)制的時(shí)候會(huì)傳輸所有權(quán)

                    反正由此可見(jiàn):標(biāo)準(zhǔn)庫(kù)的智能指針就是無(wú)甚大用。

                   在這樣的情況下,C++標(biāo)準(zhǔn)委員會(huì)自然需要考慮引入新的智能指針。目前由C++標(biāo)準(zhǔn)委員會(huì)庫(kù)工作組發(fā)起的Boost 組織開(kāi)發(fā)了Boost系列智能指針。

                    在Boost中的智能指針有五種: scoped_ptr,scoped_array,shared_ptr,shared_array,weak_ptr.

                    前4種完全是針對(duì)標(biāo)準(zhǔn)庫(kù)中的auto_ptr提出解決方案,如:scope_ptr是針對(duì)“auto_ptr在被復(fù)制的時(shí)候會(huì)傳輸所有權(quán)”這一弱點(diǎn)提出的。最后一種沒(méi)見(jiàn)過(guò),看名字像是弱引用智能指針,我懷疑是不是類(lèi)似于JAVA中弱引用一樣,有待進(jìn)一步學(xué)習(xí)。

                    還查到一篇:
             
                   C++深度探索系列:智能指針(Smart Pointer) [一] 
                    http://dev.csdn.net/develop/article/17/17530.shtm

                    有空可以看看!


            posted on 2009-06-18 10:47 Sandy 閱讀(390) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): c++學(xué)習(xí)
            色老头网站久久网| 亚洲国产精品无码久久SM| 青青热久久综合网伊人| 国产精品九九久久免费视频 | 理论片午午伦夜理片久久| 国产精品中文久久久久久久| 97久久超碰国产精品2021| 久久国产视屏| 亚洲va中文字幕无码久久不卡| 久久精品国产免费一区| 久久综合五月丁香久久激情| 成人国内精品久久久久一区| 中文字幕无码久久久| 久久国产精品国产自线拍免费| 亚洲午夜无码AV毛片久久| 久久国产精品国产自线拍免费| 久久亚洲国产最新网站| 亚洲嫩草影院久久精品| 亚洲AV无码久久寂寞少妇| 久久性生大片免费观看性| 国产精品美女久久久久网| 久久中文字幕人妻丝袜| 久久精品二区| 99久久精品九九亚洲精品| 久久国产热精品波多野结衣AV| 国产欧美久久久精品影院| 久久亚洲中文字幕精品一区| 93精91精品国产综合久久香蕉| 亚洲va中文字幕无码久久| 亚洲午夜精品久久久久久app| 久久久精品国产Sm最大网站| 久久国产精品-国产精品| 久久se精品一区二区| 99re久久精品国产首页2020| 亚洲av日韩精品久久久久久a| 中文字幕无码久久人妻| 少妇无套内谢久久久久| 久久久精品人妻一区二区三区蜜桃 | 久久久久亚洲AV成人网人人网站| 久久被窝电影亚洲爽爽爽| 国产高潮久久免费观看|