设为首页 加入收藏

TOP

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

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

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

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

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

  auto_ptr指针是一个RAII对象,它初始化时获得资源,析构时自动释放资源(生命期结束).它的缺点数不胜数:
1、auto_ptr要求一个对象只能有一个拥有者,严禁一物二主
2、缺少对引用数和数组的支持。
3、不可将auto_ptr对象作为STL容器的元素。C++(www.cppentry.com)标准明确禁止这样做,否则可能会碰到不可预见的结果。(这一条晕死一大片)。
4、auto_ptr在被复制的时候会传输所有权

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

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

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

前4种完全是针对标准库中的auto_ptr提出解决方案,如:scope_ptr是针对“auto_ptr在被复制的时候会传输所有权”这一弱点提出的。最后一种没见过,看名字像是弱引用智能指针,我怀疑是不是类似于JAVA中弱引用一样,有待进一步学习。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++智能指针的学习体会 下一篇C++的多线程编程基础

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目