为什么要使用智能指针

来源:互联网 发布:淘宝客佣金怎么追回 编辑:程序博客网 时间:2024/06/04 19:08

一个类库的产生势必有其触发动机,正如某句经典语所云:在这个世界上,没有无缘无故的爱,也没有无缘无故的恨。同样的,在C++世界

里,也没有无缘无故的智能指针 :)。搞清楚Smart Pointer的设计动机,对于正确的理解Smart Pointer的工作原理,设计思想,以及适用场合

是有着非常直接的帮助的,所以让我们先来看一看为什么需要Smart Pointer。

从本质上来说,Smart Pointer的引入实际上是为了解决一个问题: 有效,准确地管理程序运行过程中动态申请的内存资源,以妥善地解决动态

申请到的内存的拥有权问题.(为便于描述,后面将Smart Pointer所要解决的问题简要描述为"动态内存拥有权问题")

在c++程序中,我们经常会出于这样那样的原因,从系统堆(heap)中动态申请内存,用于存放一些只有在程序运行期才能确定其大小的数据对

象。而在现实的计算机系统中,内存资源的总量是有限的,所以,有了申请,就得有释放,只有这样,才能好聚好散,为从heap中持续申请获

得内存打好铺垫。

如果,对于每一个动态内存申请点来说,我们都能够清晰地确定其释放点,那么,动态申请内存的释放似乎并不是一件值得为之特殊考虑的

事情。

但是,实际的软件系统中的数据依赖关系往往非常复杂,很多时候,会复杂到不太容易确定一块动态申请到的内存到底到了何时就真得可以释放掉了。

比如说,对于同一块动态申请到的内存,在程序中往往会有多个引用点,这种多指一的关系,就提出了额外的数据一致性的要求,只有在确保多个引

用点都不会再访问这块动态内存的前提下,才可以安全地将其释放掉.

再比如说,C++中的异常处理机制强化了程序员处理错误场景的能力,但是异常这种机制在本质上类似于goto语句的灵活性也为动态内存的释放

增加了管理上的负担.

当然,为了精准无误的手工释放动态申请到的内存,程序员可以仔细地对程序中的数据依赖关系作仔细地考量和设计,从而确保安全准确地手工

释放动态内存。但是,动态内存的拥有权问题往往并不是软件系统的核心竞争力所在(我们可以说内存管理是一个软件系统的基础设施的

重要构成部分,但是说它是一个软件系统的核心竞争力所在,似乎就不太合适了,当然,对于以内存管理为市场卖点的软件产品是个例

外,比如SmartHeap),在软件开发过程中,花费过多精力来解决动态内存的拥有权问题,看起来多少有些不划算。

如果能够将“动态内存拥有权”这个问题的复杂性,从软件产品本身的复杂性中分离出来,由专门的人或团队来负责实现,实际上是非

常有利于软件的模块化和复用性的。毕竟,从本质上来看,动态内存的拥有权和一款软件产品本身所要解决的目标问题在相当大程度上是正

交的,将其分解开来,分而治之从软件工程学的角度来看实在是个不赖的选择。(当然,一定要较真的话,不同的软件产品,相应的程序行为特

征也有所不同,为不同的软件,甚至为同一款软件的不同架构的实现定制一套专门的管理动态内存拥有权的策略也许能够获得更好的效果,比

如说,针对某个特殊的应用,定制特殊的Smart Pointer,也许会比使用通用的Smart Pointer会获得更好的时空效率,但这是另外一个关乎软

件设计思想的问题了,本文主要关注的是对动态内存拥有权问题提供一种普适的解决方案,所以对这种special case就暂且存而不论了)

所以说,Smart Pointer正是为了专门解决"动态内存拥有权"这一问题的产物。