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 阅读(4159) 评论(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
你可以参阅:
智能指针的代码实例   回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理