C++智能指针的实现介绍

  次阅读 作者:智能小宝 来源:互联网 2016-01-26 10:15 我要评论(0)

以下是对C++中智能指针的使用进行了详细的分析介绍,需要的朋 友可以参考下

1. 为什么需要智能指针?

简单的说,智能指针是为了实现类似于Java中的垃圾回收机制。Java的 垃圾回收机制使程序员从繁杂的内存管理任务中彻底的解脱出来,在申请使用一块内存区域之后,无需去关注应该何时何地释放内存,Java将会自动帮助回收。 但是出于效率和其他原因(可能C++设计者不屑于这种傻瓜氏的编程方式),C++本身并没有这样的功能,其繁杂且易出错的内存管理也一直为广大程序员所诟 玻

更进一步地说,智能指针的出现是为了满足管理类中指针成员的需要。包含指针成员的类需要特别注意复制控制和赋值操作,原因是复制指针时只复制指针中的地 址,而不会复制指针指向的对象。当类的实例在析构的时候,可能会导致垂悬指针问题。

管理类中指针成员的方法一般有两种方式:一种是采用值型类,这种类是给指针成员提供值语义(value semantics),当复制该值型对象时,会得到一个不同的新副本。这种方式典型的应用是string类。另外一种方式就是智能指针,实现这种方式的指 针所指向的对象是共享的。

2. 智能指针的实现概述

智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。

每 次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行 赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数 减少引用计数(如果引用计数减至0,则删除基础对象)。

实现智能指针有两种经典策略:一是引入辅助类,二是使用句柄类。

3. 实现方式1:引入辅助类

这种方式定义一个单独的具体类(RefPtr)来封装指针和相应的引用计数。

复制代码 代码如下:

class Point//基础对象类

{

public:

Point(int xVal = 0, int yVal = 0):x(xVal),y(yVal) { }

int getX() const { return x; }

int getY() const { return y; }

void setX(int xVal) { x = xVal; }

void setY(int yVal) { y = yVal; }

private:

int x,y;

};

class RefPtr//辅助类

{//该类成员访问权限全部为private,因为不想让用户直接使用该类

friend class SmartPtr;//定义智能指针类为友元,因为智能指针类需要直接操纵辅助类

RefPtr(Point *ptr):p(ptr), count(1) { }

~RefPtr() { delete p; }

int count;//引用计数

Point *p;//基础对象指针

};

class SmartPtr//智能指针类

{

public:

SmartPtr(Point *ptr):rp(new RefPtr(ptr)) { }//构造函数

SmartPtr(const SmartPtr &sp):rp(sp.rp) { ++rp->count; }//复制构造函数

SmartPtr& operator=(const SmartPtr& rhs) {//重载赋值操作符

++rhs.rp->count;//首先将右操作数引用计数加1,

if(--rp->count == 0)//然后将引用计数减1,可以应对自赋值

delete rp;

rp = rhs.rp;

return *this;

}

~SmartPtr() {//析构函数

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...