您的位置:首页 > 编程语言 > C语言/C++

C++学习之智能指针--auto_ptr、scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr

2014-04-10 21:52 776 查看

智能指针概述

本文主要讲解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,或者/article/1422721.html,但是这里需要注意的是:只有第一个智能指针的对象通过HasPtr(int*p,int
i)构造函数初始化,其他通过复制构造函数,以保证多个智能指针对象使用的是同一个引用计数。

C++标准库和BOOST库中的智能指针

参见C++primer17.1.9和

下面简单介绍下标准库auto_ptr和Boost库scoped_ptr,其他请参见boost程序库完全开发指南第一版第三章,下载链接 BOOST程序库完全开发指南第一版

标准库auto_ptr类

auto_ptr类模板提供的方法如下:



BOOST::scoped_ptr类

其实现如下:





auto_ptr与scoped_ptr区别:



注意scoped_ptr有一个public的auto_ptr参数的构造函数,参照boost_1_54_0/boost/smart_ptr/scoped_ptr.hpp 如下:



智能指针的引申--句柄

C++中一个通用的技术就是定义句柄类,类中维护一个基类的指针,以实现多态,像任何保存指针的类一样,句柄需要表现的像一个智能指针。具体参见:C++primer第四版15.8和16.5

参考:

1.http://mxdxm.iteye.com/blog/763601

2./article/1422721.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: