• <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>

            martin

            thinking

            常用鏈接

            統計

            software

            最新評論

            C++中的智能指針

            1.淺論C++中的智能指針(Smart Pointer)
            簡單地講,智能指針是用一個對象來對指針進行建模,使之具有指針的特性,跟指針具有相同含義的->,*操作.并且通過對象的構造函數(獲取資源),析構資源(釋放資源)來對資源進行管理,從而減少程序員對通過new操作獲取到的對象的生命周期進行管理的負擔.
            根據《Moden C++ Design》, 我們可以構造具有很多正交特性的智能指針。
            1.1  C++中的智能指針與JAVA中的對象
            前段時間跟朋友聊了些有關JAVA的東西,感覺上Java中的對象就是C++中的智能指針,但具有不同的資源釋放方式。在JAVA中,不能象C++中運用" A a;"語句聲明得到一個類(A)的事例a,而必須通過下列語句來獲得:Aa = new A.要在釋放a時,應用必需通知
            GC(垃圾收集功能)來釋放該實例所占用的資源。當然,JAVA中的對象有一小點同C++中的職能智能不同,因為在C++中指針不具有"."操作符,故智能指針一般也不提供"."操作符,但在Java中都是通過"."操作符對對象進行操作的,不過我們可以把C++中職能指針的"->"操作符與
            Java中的"."操作符進行類比。
            1.2  引用計數型智能指針
            在C++中有一種常用的智能指針是引用計數型智能指針:RCSmartPtr. 它的實現基理如下:
            首先,存在RCObject,即存在一個對象,該對象提供引用計數接口。
            另外,要存在指向RCObject的RCSmartPtr對象,在RCSmartPtr對象的構造過程中,把指向RCObject的指針作為參數傳入RCSmartPtr中。因此每增加一個RCSmartPtr對象,就多了一個指向RCObject的指針。RCSmartPtr可以通過調用RCObject的引用計數接口,增加RCObject
            的引用計數。同樣的道理可以在RCSmartPtr對象的析構函數中調用RCObject的引用記數接口來減少RCObject的引用記數。
            第三,在對RCObject的引用計數進行操作時對引用計數進行檢查,如果引用計數為0,則RCObject將摧毀本身,從而釋放該對象所占用的資源。
            通過這種方式,我們就可以把對資源的管理交給機器來管理,解除了對人工的倚賴。
             

            posted on 2009-03-03 15:00 martin_yahoo 閱讀(4183) 評論(5)  編輯 收藏 引用

            評論

            # re: C++中的智能指針 2009-03-03 16:08 abettor

            說實話,如果沒有真正用過智能指針的人來讀博主的文章,可能會摸不到頭。要是給出點具體的例子(如代碼)就好了。  回復  更多評論   

            # re: C++中的智能指針 2009-03-03 18:37 路人乙

            "感覺上Java中的對象就是C++中的智能指針",你這個感覺差得太遠了,完全不是一個東西,不是一個機制,完全沒有可比性,居然被安上“就是”。后面還言之鑿鑿的比較起兩個各有什么操作符來,完全是在誤人子弟!  回復  更多評論   

            # re: C++中的智能指針 2009-03-03 18:47 陳梓瀚(vczh)

            智能指針使用引用計數,如果一不小心循環了(譬如將雙向鏈表中的兩個指針都用智能指針代替),就完蛋了。  回復  更多評論   

            # re: C++中的智能指針[未登錄] 2009-03-09 15:14 martin_yahoo

            @陳梓瀚(vczh)
            class T; //雙向鏈表的節點類
            class T_var;  //為指向對象T的智能指針類.
            class T_list; //雙向鏈表數據結構類
            假設class T為雙向鏈表上的節點,故它的定義可以簡單地用如下方式表示:

            calss T{
            ....
            private:
            T_var beforePtr;
            T_var nextPtr;
            };

            現在考慮三個節點:N ,N1,N2節點.
            N節點的nextPtr指向N1, beforePtr指向其它節點
            (如果N節點前面沒有其它節點,此時只有N1節點引用它,則它的引用計數為1;如果前面還有還有其它節點,則它的引用計數為2).

            N1節點的nextPtr指向N2, beforePtr指向N節點.
            (N1節點的引用計數為2).

            N2節點的nextPtr指向其它節點, beforePtr指向N1節點.
            (如果N節點后面沒有其它節點,此時只有N1節點引用它,則它的引用計數為1;如果后面還有還有其它節點,則它的引用計數為2).

            現在假設要刪除N1節點, 把N2節點中的beforePtr指向N,
            則N節點的引用計數增加一,N1節點的引用計數減少1,變成1.
            把N節點的nextPtr指向N2節點,則N2的引用計數增加一,N1節點的引用計數減少1,從而N1節點的引用計數被降到0,N1節點將被自動摧毀.

            此時,N,N2節點的引用計數將各自減一.維持與N節點存在是一致.這種情況下沒完蛋.

            考慮到在類T_list中包含有雙向鏈表的首,尾地址.因此在一般情況下,各節點的引用計數都為2.

            因此,對于首,尾節點的操作與N1節點一致.
              回復  更多評論   

            # re: C++中的智能指針[未登錄] 2009-03-09 16:19 martin_yahoo

            @abettor
            你可以參閱:
            智能指針的代碼實例   回復  更多評論   

            欧美牲交A欧牲交aⅴ久久| 亚州日韩精品专区久久久| AV无码久久久久不卡蜜桃| 久久精品人人做人人爽电影| 国产无套内射久久久国产| 久久综合精品国产一区二区三区| 国产精品久久久久久久久久影院 | 久久久网中文字幕| 亚洲精品NV久久久久久久久久| 亚洲va中文字幕无码久久| 天天综合久久久网| 大香伊人久久精品一区二区| 久久久精品国产sm调教网站| 老司机午夜网站国内精品久久久久久久久 | 久久精品成人一区二区三区| 麻豆av久久av盛宴av| 国产精品久久久久久一区二区三区 | 无码任你躁久久久久久| 久久国产热精品波多野结衣AV| 久久久99精品成人片中文字幕| 久久人人爽人人爽人人AV | 久久精品这里只有精99品| 久久综合亚洲欧美成人| 久久综合视频网站| 91亚洲国产成人久久精品网址| 无码AV中文字幕久久专区| 老司机午夜网站国内精品久久久久久久久| 久久久久无码精品国产不卡| 伊人久久大香线蕉亚洲五月天| 欧美精品一区二区久久| 久久精品亚洲欧美日韩久久| 2021少妇久久久久久久久久| 亚洲熟妇无码另类久久久| 亚洲另类欧美综合久久图片区| 久久精品成人影院| 久久精品国产99国产精品| 91精品国产高清久久久久久91| 久久精品国产秦先生| 色综合久久综合网观看| 久久亚洲国产午夜精品理论片| 精品人妻久久久久久888|