C++ 智能指针

来源:互联网 发布:web数据挖掘 pdf下载 编辑:程序博客网 时间:2024/04/29 06:14

1、智能指针:就是具备指针功能同时提供安全内存回收的一个类。
它是用一个对象来对指针进行建模,使之具有指针的特性,跟指针具有相同含义的 -> 和 * 操作.并且通过对象的构造函数(获取资源),析构资源(释放资源)来对资源进行管理,从而减少程序员对通过new操作获取到的对象的生命周期进行管理的负担。
除了能够在适当的时间自动删除指向的对象外,他们的工作机制很像C++的内置指针。

2、智能指针在面对异常的时候格外有用,因为他们能够确保正确的销毁动态分配的对象,他们也可以用于跟踪被多用户共享的动态分配对象。
事实上,智能指针能够做的还有很多事情,例如处理线程安全,提供写时复制,确保协议,并且提供远程交互服务。
智能指针的大部分使用是用于生存期控制,阶段控制。它们使用operator->和operator*来生成原始指针,这样智能指针看上去就像一个普通指针。

3、当类中有指针成员时,一般有两种方式来管理指针成员:
1)采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;
2)更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。


4、智能指针的一种通用实现技术是使用引用计数。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针,具体实现步骤如下:
1)每次创建类的新对象时,初始化指针并将引用计数置为1;
2)当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数(加1);
3)对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(减1,如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数(加1);
4)调用析构函数时,析构函数减少引用计数(减1,如果引用计数减至0,则删除基础对象)。

5、指针可以分为泛型指针,原生指针、智能指针,它们的含义和区别如下:


1. 泛型指针

是指数据类型不确定的指针,它有多种含义:
(1) 指void*指针,可以指向任意数据类型,因此具有“泛型”含义。
(2) 指具有指针特性的泛型数据结构,包含泛型的迭代器、智能指针等。

广义的迭代器是一种不透明指针,能够实现遍历访问操作。通常所说的迭代器是指狭义的迭代器,即基于C++的STL中基于泛型的iterator_traits实现的类的实例。总体来说,泛型指针和迭代器是两个不同的概念,其中的交集则是通常提到的迭代器类。


2. 原生指针
就是普通指针,与它相对的是使用起来行为上像指针,但却不是指针。
说“原生”是指“最简朴最基本的那一种”。因为现在很多东西都抽象化理论化了,所以“以前的那种最简朴最基本的指针”只是一个抽象概念(比如iterator)的表现形式之一。


3. 智能指针
智能指针是C++里面的概念,由于 C++ 语言没有自动内存回收机制,程序员每次得自己处理内存相关问题,
但用智能指针便可以有效缓解这类问题,引入智能指针可以防止出现悬垂指针的情况。
一般是把指针封装到一个称之为智能指针类中,这个类中另外还封装了一个使用计数器,对指针的复制等操作将导致该计数器的值加1,对指针的delete操作则会减1,值为0时,释放指针,并指针为NULL。

6、引用计数型智能指针
C++中有一种常用的智能指针,是引用计数型智能指针:RCSmartPtr。 它的实现基理如下:
首先,存在RCObject,即存在一个对象,该对象提供引用计数接口。
其次,要存在指向RCObject的RCSmartPtr对象,在RCSmartPtr对象的构造过程中,把指向RCObject的指针作为参数传入RCSmartPtr中。因此每增加一个RCSmartPtr对象,就多了一个指向RCObject的指针。RCSmartPtr可以通过调用RCObject的引用计数接口,增加RCObject的引用计数。同样的道理可以在RCSmartPtr对象的析构函数中调用RCObject的引用记数接口来减少RCObject的引用记数。
最后,在对RCObject的引用计数进行操作时对引用计数进行检查,如果引用计数为0,则RCObject将摧毁本身,从而释放该对象所占用的资源。
通过这种方式,我们就可以把对资源的管理交给机器来管理,解除了对人工的倚赖。

7、标准C++的智能指针auto_ptr。
auto_ptr的使用是有很多限制的:

1.1 auto_ptr要求一个对象只能有一个拥有者,严禁一物二主。
比如以下用法是错误的。
classA *pA = new classA;
auto_ptr<classA> ptr1(pA);
auto_ptr<classA> ptr2(pA);

1.2 auto_ptr是不能以传值方式进行传递的。
因为所有权的转移,会导致传入的智能指针失去对指针的所有权。如果要传递,可以采用引用方式,利用const引用方式还可以避免程序内其它方式的所有权的转移。

1.3 其它注意事项:
a、不支持数组。
b、注意其Release语意,它没有引用计数,与com提供的智能指针不同。Release是指释放出指针,即交出指针的所有权。
c、auto_ptr在拷贝构造和=操作符时的特珠含义,决定它不能做为STL标准容器的成员。




0 0
原创粉丝点击