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將摧毀本身,從而釋放該對象所占用的資源。
通過這種方式,我們就可以把對資源的管理交給機器來管理,解除了對人工的倚賴。