c++ shared_ptr智能指针使用注意事项
来源:互联网 发布:淘宝双12红包 编辑:程序博客网 时间:2024/05/18 02:46
shared_ptr在boost中地位相当重要,其行为最接近原始指针,但又比指针更加安全,甚至还能提供基本的线程安全保证。它基本上解决了在使用c++开发过程中不可避免的使用指针而遇到的许多问题,常见的毫无疑问是内存泄漏和内存的提前释放,还有一些关于指针内存申请而产生的异常问题等。而要想较好的使用shared_ptr来完全取代指针绝非易事。下面简要说说使用shared_ptr需要注意的问题。
1、share_ptr是一个类,它产生的是一个类对象,而不是一个原生的指针对象,但是为了减少类对象与针对对象使用的差异性,所以share_ptr类故意重载了两种常见的指针操作符: *和->。从而share_ptr与普通指针使用方式一样。简言之,就是share_ptr生成的一个包含类型指针容器对象,它封装了指针对象,对指针对象负全责,包括生成、释放等;
2、特别需要注意的是,share_ptr的转型函数不能使用c++常用的转型函数,即static_cast,dynamic_cast,const_cast,而要使用static_pointer_cast,dynamic_pointer_cast,const_pointer_cast。原因有两个:static_cast,dynamic_cast,const_cast的功能是转换成对应的模版类型,即static_cast<T*>其实是转换成类型为T的指针;前面说了share_ptr生成的一个包含类型指针容器对象,使用简单的c++转型函数是将share_ptr对象转型为模版指针对象,这完全违背了使用share_ptr的初衷(除非你确确实实有这种需要!),导致转型的模版指针对象不能采用share_ptr进行管理。因为上面的两个原因:share_ptr为了支持转型,所以提供了类似的转型函数即static_pointer_cast<T>,从而使转型后仍然为shared_pointer对象,仍然对指针进行管理;
3、share_ptr类重载了许多的构造函数,其中包含无参的构造函数用来创建一个持有空指针的share_ptr对象,,注意它不等价于持有void*型的指针对象。要想生成一个存储void*型的指针,可以使用share_ptr(void*)构造函数来构造,它相当于一个泛型的指针容器,拥有容纳任意类型的能力,但是将包含void*指针的shared_ptr对象使用注意2中的转型函数转型为某种类型的指针会使代码不够安全,一般不要使用;
4、share_ptr完美支持标准容器,并且不需要担心资源泄漏。而标准容易在使用指针对象时需要特别的小心,对指针需要额外的管理。下面用代码范例来演示如何将share_ptr应用与标准容器:
<SPAN style="FONT-SIZE: 14px"><STRONG>#include <boost/make_shared.hpp>#include <vector>
using namespace std;
using namespace boost;
int main ()
{
typedef vector< shared_ptr<int> > sharedContainers;
sharedContainers sharedArray(10);
for(sharedContainers::interator pos = sharedArray.begin() , int i=0 ;pos!=sharedArray.end();++pos)
{
*pos = make_shared<int>(++i);
cout<<*(*pos)<<"\t";
}
cout<<endl;
}</STRONG></SPAN>
注意上面的代码中的头文件#include <boost/make_shared.hpp>,不是常见的#include <boost/smart_ptr.hpp>,这是因为make_shared.hpp中提供了一个自由工厂函数make_shared<T>(),来消除显示的new调用,其实是模仿了标准库中产生pair的函数make_pair().因为make_shared.hpp中包含了smart_ptr.hpp,所以加入了make_shared.hpp就不需要再声明smart_ptr.hpp头文件了。而smart_ptr.hpp没有包含make_shared.hpp,所以必须要单独写出make_shared.hpp。
- 使用智能指针shared_ptr注意事项
- c++ shared_ptr智能指针使用注意事项
- c++ shared_ptr智能指针使用注意事项
- c++ shared_ptr智能指针使用注意事项
- C++:智能指针之shared_ptr
- 智能指针tr1::shared_ptr、boost::shared_ptr使用
- 智能指针shared_ptr使用学习
- C++:智能指针-TR1的shared_ptr和weak_ptr使用介绍
- C++:智能指针-TR1的shared_ptr和weak_ptr使用介绍
- 【C++】智能指针auto_ptr/unique_ptr/shared_ptr/weak_ptr!!!
- 智能指针使用注意事项
- 智能指针shared_ptr组件的使用
- c++智能指针的使用,auto_ptr,shared_ptr
- C++ 智能指针 shared_ptr
- 智能指针 shared_ptr
- Boost智能指针:shared_ptr
- 智能指针shared_ptr
- 智能指针shared_ptr
- 【重温】C++中String类的实现
- 想趁现在尽可能多尽可能详细地记录下我昨晚的梦
- iOS ARC使用总结
- 最大子序列的两种算法
- jQuery 入门教程(1): 概述
- c++ shared_ptr智能指针使用注意事项
- DevExpress的控件GridControl光标定位到某一个单元格
- 黑马程序员高级视频学习笔记交通等管理系统
- ffmpeg源码分析
- 似乎在北京,所有人都变得那么通情达理。
- boost库中的智能指针向上转换
- Ubuntu装好后root的密码设置
- jQuery 入门教程(2): 基本语法
- js中null和 document.getElementById("userId")小结