C++学习之智能指针--auto_ptr、scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr
来源:互联网 发布:mac光影 编辑:程序博客网 时间:2024/05/22 05:26
智能指针概述
本文主要讲解C++primer中的智能指针的概念,以及标准库中的auto_ptr类,boost库中的scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr,其中很多个人的理解,如有问题欢迎指正。这里面涉及到 解引用操作符的重载,箭头操作符的重载,类模板等知识。
在编写C++代码的时候,经常需要分配内存、释放内存,一般是通过指针实现的,即便是资深的C++程序员有时也会忘掉delete,这就会导致内存的泄漏,这就需要一种自动释放资源的机制,所以提出了智能指针的概念,我们通过智能指针对象代理了普通指针的行为(代理模式)。智能指针其实就是模拟指针动作的类,所以智能指针类一般都会重载 -> 和 * 操作符。智能指针对象能在资源不再被使用的时候自动释放资源,也就是在智能指针对象析够的时候自动去释放其管理的资源。
智能指针的分类
智能指针主要分为两类:按资源供几个智能指针对象管理分为独占型(自己起的名字)和共享型智能指针。独占型智能指针所管理的资源只能由一个智能指针对象负责管理(即释放),独占型又可以细分为可以转让管理权和不能转让管理权两种类型,可转让管理权的智能指针在复制构造和赋值的时候都会发生管理权的转移,比如sp2=sp1,赋值结束后,sp2释放了对以前资源的管理权,开始拥有赋值前sp1所指对象的管理权,sp1不在拥有管理权。共享型智能指针通过维护一个对资源的引用计数来实现多个智能指针对象使用同一资源,每当资源上新增一个智能指针对象的时候,引用计数就加1,智能指针对象析够的时候,引用计数减1,当引用计数减为0的时候,释放资源。
其中标准库中的auto_ptr和boost库中的scoped_ptr是独占型智能指针类模板,前者可以转让管理权,后者不能转让(因为赋值操作符和复制构造函数为private)。boost库中的shared_ptr、shared_array是共享型。这些都是用来管理单个资源的,因为释放资源调用的是delete。*_array是用来管理动态数组的,释放资源调用的是delete[]。
智能指针的实现形式
独占型的智能指针一般定义如下:
template <class T>class smartpointer{private:T *_ptr;public:smartpointer(T *p) : _ptr(p) //构造函数{}T& operator *() //重载*操作符{return *_ptr;}T* operator ->() //重载->操作符{return _ptr;}~smartpointer() //析构函数{delete _ptr;}};共享型智能指针实现一般会定义一个单独的类用以封装引用计数和相关指针(当然引用计数也可以封装在智能指针内部),如下U_Ptr是引用计数,HasPtr是智能指针:
共享型智能指针请参见C++primer13.5.1,或者http://blog.csdn.net/hackbuteer1/article/details/7561235,但是这里需要注意的是:只有第一个智能指针的对象通过HasPtr(int*p,int i)构造函数初始化,其他通过复制构造函数,以保证多个智能指针对象使用的是同一个引用计数。
C++标准库和BOOST库中的智能指针
参见C++primer17.1.9和
标准库auto_ptr类
BOOST::scoped_ptr类
auto_ptr与scoped_ptr区别:
智能指针的引申--句柄
参考:
1.http://mxdxm.iteye.com/blog/763601
2.http://blog.csdn.net/hackbuteer1/article/details/7561235
- C++学习之智能指针--auto_ptr、scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr
- boost 智能指针auto_ptr scoped_ptr shared_ptr scoped_array shared_array 总结
- 【C++】智能指针的作用,模拟实现auto_ptr,scoped_ptr,shared_ptr,scoped_array,shared_array
- auto_ptr scoped_ptr scoped_array shared_ptr weak_ptr
- 智能指针 boost(scoped_ptr,scoped_array,shared_ptr,shared_array) 和 std (auto_ptr)的比较 .
- 智能指针auto_ptr、scoped_ptr、shared_ptr和weak_ptr
- 智能指针scoped_ptr,shared_ptr,weak_ptr和auto_ptr的使用
- 详解C++各种智能指针: auto_ptr, shared_ptr, weak_ptr, scoped_ptr
- 智能指针——auto_ptr、shared_ptr、weak_ptr、scoped_ptr
- 【C++】智能指针auto_ptr/unique_ptr/shared_ptr/weak_ptr!!!
- 智能指针--scoped_ptr shared_ptr weak_ptr
- auto_ptr,scoped_ptr,shared_ptr,weak_ptr
- auto_ptr,shared_ptr,weak_ptr,scoped_ptr
- Boost智能指针:scoped_ptr shared_ptr weak_ptr
- 浅析Boost智能指针:scoped_ptr shared_ptr weak_ptr
- 几种智能指针的比较(std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::weak_ptr)
- auto_ptr,scoped_ptr,shared_ptr,weak_ptr区别
- 智能指针:模拟实现auto_ptr,scoped_ptr,shared_ptr
- “临时工”打死老人,城管能卸责?
- 浅谈Java泛型中的extends和super关键字
- OGG在Linux上的安装
- android:screenOrientation属性
- Maven resources 及 Filtering机制
- C++学习之智能指针--auto_ptr、scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr
- 聊天工具的架构分析
- hibernate联合主键(转)
- 查询媒体数据库
- GG在win上基于Sqlserver的安装
- MySQL的基本语句
- 让精灵动起来
- JS 操作JSON
- 程序员/设计师能用上的 75 份速查表