什么是智能指针

那么,具体来说,智能指针以什么样的方式解决了"动态内存拥有权"的问题呢?

概要地来说,Smart Pointer通过增加一组Wrapper Class,让指向动态内存的指针在Wrapper Class层面具备了值语义(value-semantic),从而解

决了指针所指向的动态内存的拥有权问题。

(关于值语义这个概念,第一次碰到是在阅读<<Modern C++ Design>>的过程中,但是在ISO c++标准文献中并没有找到显式的描述,在<<Modern 

C++ Design>>中也只是略有提及,另外在SGI的STL文档中,提到了一个Assignable的concept,跟值语义倒是比较接近.不过这些资料中对值语义的

描述看起来还是概要了一些,所以这里我结合阅读过的文档资料,给出了自己的定义)

什么是 值语义呢?

就是给定一个源对象,可以自由地将其内容复制到另一个目标对象之中.在复制动作完成之后,源对象及目标对象在对象接口层次不

存在耦合关系,所以我们可以在对象接口层次随意操作源及目标对象而不需要显式考虑两者之间的数据同步性问题.

对于普通的C++内建数据类型(如int, double数据),它们自然地就具备了值语义.而指向动态内存的指针则不满足值语义.

进一步深入探讨,我们发现动态内存指针之所以不满足值语义,是因为动态内存指针涉及到其指向的动态内存的拥有权的管理,而在将一个动态

内存指针所指向的动态内存地址复制到目标指针的同时,指针所指向的动态内存的拥有权也被该目标指针共享.对同一片动态内存区域,存在两

个引用点,这就带来了同步性的问题,对源指针和目标指针的操作不是完全正交的,这在 1.为什么要使用智能指针 中已有描述.

从本质上来说,给定一块动态内存区域,如果存在多个指向它的对象话,动态内存拥有权的同步问题是不可回避的. 不过,我们是不是可以将这个

拥有权的同步问题封装在有限的范围内,从而在对象接口层面让客户端的代码获得值语义的使用体验呢?这正是Smart Pointer的设计理

念.

通常来说,Smart Pointer会提供一个Wrapper class,对C++中原生的指针进行封装,在Wrapper class内部,通过一个计数器来协调指向同一块动态

内存区域的多个Smart Pointer之间的所有权关系.而Wrapper class会提供客户端代码通常会施加在原生指针上的绝大多数操作接口,比如提领操

作(dereference),地址比较操作,等等.这样,在保证跟原生指针相近的操作体验的同时,简化了动态内存的管理负担.

注:针对不同的应用场景,实际的Smart Ptr存在若干不同的分类,比如,
    不支持值语义,只提供RAII(Resource Accquisition In Initialization)的资源管理机制的智能指针,典型代表是Boost Scope Ptr;
    支持毁坏式复制语义及RAII的智能指针,典型代表是std::auto_ptr;
    为了解决指针循环引用而引入的智能指针,典型代表是Boost weak ptr;

    以及上面提到的,支持值语义,提供引用计数机制及RAII支持的智能指针,典型代表是Boost Shared Ptr以及Loki Smart Ptr.

本文主要还是围绕第四种智能指针类型展开讨论,所以文章中所提及的Smart Ptr如无特别说明,指代的就是跟Boost Shared Ptr同型的智能指针.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值