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