写在前面:
如果你是名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) |