C++智能指针应用方式体验

来源:互联网 发布:银行获取银联刷卡数据 编辑:程序博客网 时间:2024/06/06 15:50

自己的项目中大量使用到了智能指针(非标准库中的),没办法,硬着头皮研究了一下午,才大致有点思路。今天一整天实在头疼(估计曹操当年就这么疼的吧.   ^_^),破例九点多就睡觉...

 

原文地址:http://developer.51cto.com/art/201002/183350.htm

 

 

C++语言对于C语言功能的支持是完全的,它不但具有这些功能,而且还能在其基础上更加优化这些强大的功能。在这里我们将会为大家介绍下其中的C++智能指针的相关应用方法,以方便大家对这方面的理解。

 

内存泄露是C++程序员都头疼的大问题。C++缺乏像JAVA、C#一样,拥有GC这么一项有利的武器,它将内存管理的部分权限交给了程序员。虽然GC的存在节约了开发、排错的时间与成本,但是C++为了追求运行速度而20年来坚决不予补充进其标准。(题外话:C++通过加大开发难度去换取执行速度的做法,在现在看来不知是否能给与正面的评价,还是留给将来再说吧。)

 

从此,在堆上申请了内存忘了释放、所造成的内存泄露的问题就一直困扰着C++程序员。也许为了稍许弥补没有垃圾回收器所造成的开发门槛高,各大厂商开发的C++库中都像COM学习引入智能指针试图解决部分目前存在的问题。

 

C++智能指针是存储指向动态分配(堆)对象指针的类, 用于生存期控制, 能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

 

说到C++智能指针,我们一定要看看标准C++库提供的“搞笑的”智能指针:auto_ptr。

 

标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,网上评论C++标准库时都说:“在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的佳作。”但目前的标准C++中,只有一种独苗智能指针:std::auto_ptr。

 

auto_ptr指针是一个RAII对象,它初始化时获得资源,析构时自动释放资源(生命期结束).它的缺点数不胜数:

1、auto_ptr要求一个对象只能有一个拥有者,严禁一物二主

2、缺少对引用数和数组的支持。

3、不可将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果。(这一条晕死一大片)。

4、auto_ptr在被复制的时候会传输所有权


反正由此可见:标准库的智能指针就是无甚大用。

 

在这样的情况下,C++标准委员会自然需要考虑引入新的智能指针。目前由C++标准委员会库工作组发起的Boost 组织开发了Boost系列智能指针。

 

在Boost中的C++智能指针有五种: scoped_ptr,scoped_array,shared_ptr,shared_array,weak_ptr.

 

前4种完全是针对标准库中的auto_ptr提出解决方案,如:scope_ptr是针对“auto_ptr在被复制的时候会传输所有权”这一弱点提出的。最后一种没见过,看名字像是弱引用智能指针,我怀疑是不是类似于JAVA中弱引用一样,有待进一步学习。