Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191265
  • 博文数量: 15
  • 博客积分: 1630
  • 博客等级: 上尉
  • 技术积分: 177
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-18 16:12
文章分类

全部博文(15)

文章存档

2014年(1)

2012年(8)

2010年(6)

我的朋友

分类: C/C++

2012-03-31 10:21:52

写在前面:
       如果你是名C++爱好者,而且你还没接触过boost,那么我强烈推荐你学习它。一群狂热C++爱好者写出的库会是怎样的?你看完之后会有很深的感触的。

Smart Pointer

智能指针,简要地讲,就是不需要用工delete的指针。标准库里的auto_ptr,说实话,像Soctt Meyer这样的专家都建议少用,不过,他非常喜欢boost中的智能指针。

scoped_ptr        

它的特点是:不能复制或者赋值,它只提供“资源获取就是初始化”。减少功能以增加安全性,使得它高效而简单。注意:不能用于容器或动态分配的数组指针。有两个特殊的成员函数 void reset(T* p=0) 和 T* get() const,这是与裸指针沟通的纽带。在使用方面,几乎与auto_ptr一模一样。
如果你明确表示某个指针的使用仅限定一个特定的作用域,那么scoped_ptr是绝好的选择。

scoped_array        

与scoped_array类似,不同之处是它提供了 [] 重载,删除指针也使用 delete[]。诚如,动态数组最好用vector代替。

shared_ptr        

一重量级选手。它最大的特点是能用于STL容器,因为它有引用计数。如果说shared_ptr仅仅是auto_ptr加上引用计数,这也太小看它了。智能指针用于容器还有一个问题是剥离,因为auto_ptr在类型转换上做得不好,只要 T* 能被隐式地转换到 U*,则 shared_ptr 就能被隐式地转换到 shared_ptr。特别是,shared_ptr 隐式转换到shared_ptr,当 U 是 T 的一个可访问基类的时候,还能转换到 shared_ptr,以及转换到 shared_ptr
share_ptr还能够指定负责释放资源的对象。比如说FILE*,可能最后要使用fclose。(C++的ifstream就好多了)

作为一个功能强大的智能指针,值得写的当然非常多,比如说相当多的构造函数。多提一句,将指针用于排序容器时要提供比较函数子,智能指针也不例外。

shared_array        

以往这个时候就搬出vector来搪塞,不过这次shared_array有独立法宝——支持数组共享权。很多功能只有需要时才觉得它好。

intrusive_ptr        

应该说它是shared_ptr的、可管理引用计数的版本。它可以通过intrusive_ptr_add_ref 和 intrusive_ptr_release 来手动更改引用计数。已知的一个广泛用途是传递this指针到一个智能指针。原因是希望这个智能指针生命结束时,不要把this给析构掉了。

weak_ptr        

它必须从shared_ptr对象构造而来,不会影响原有的引用计数,而且它本身也不引用计数,它的使用方法如同裸指针一样(当然,你不能delete它),而且sizeof也等于裸指针的大小。从shared_ptr对象调用get也可以得到裸指针,那weak_ptr有什么特别吗?weak_ptr可能调用bool expired() const检查指针是否仍然有效,从而避免使用“悬挂指针”!
weak_ptr没有引用计数的负担,它是与裸指针最相似的一个智能指针,准确的说它只是一个shared_ptr的辅助对象。但它很轻便,像递归,循环等安全而又有很多指针赋值的地方,就很适用。

smart pointer 库小结

在boost中,谈起智能指针一般是指的shared_ptr,其它的只不过是它的辅助。智能指针不是万能,也不是完全适合于任何地方。裸指针唯一不能比过智能指针的地方是异常安全,当发生异常时,裸指针可能delete都没有机会调用,于是就有了内存泄漏。这不是常常发生的,正如C没有异常机制也存活了这么久。有了这些辅助类,shared_ptr才能如此好用。boost的智能指针彻底推翻了我们对auto_ptr的看法。
阅读(2716) | 评论(0) | 转发(0) |
0

上一篇:浮点数的内存结构

下一篇:boost之bind

给主人留下些什么吧!~~