寻找理想的智能指针资源管理综述.doc

寻找理想的智能指针资源管理综述.doc

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
寻找理想的智能指针资源管理综述.doc

寻找理想的智能指针一 04■资源管理综述 C++中的资源管理历来是比较令人头痛的问题,随着C++OX标准的酝 酿,这一问题再次引起了人们的关注。本文将和您一道对C++中的资源管理方式 进行回顾,分析与展望,并探讨理想的智能指针应该满足哪些条件。 C的时代 C语言中用指针来表示对资源的引用,这里的资源包括动态内存(堆内存) 及同步对象,文件对象等由操作系统抽象出来的对象。有的操作系统中用句柄 (handle)表示对这类对象的引用,其语义与指针是相同的。下文中提到的对象 如不加说明,一般均指资源对象。 一个用于引用资源的指针(其它的指针,比如指向局部变量的指针或指向指 针的指针,这里不予研究)从产生到消亡的整个生存期中可能处于以下四种状态: 1 空指针 所有指针刚产生时的初始状态都是空指针。C语言屮作为局部变量的指针初 始状态下包含的值是随机的,但它没有额外的语义,其实质还是空指针,程序员 应该显式将其初始化为空,以防止误用。 强指针 强指针是指向某一对象并对其拥有所有权的指针。资源产生后其引用需保存 在一个指针中,这个指针这时就是强指针,执行下面的代码后: ObjectA *pObj 1 = NULL; pObjl = new ObjectA; pObjl就成为强指针。资源的所有权可以转移,其表现形式为指针赋值。在强指 针的生存期结束之前,它所指向的资源需要被释放,否则会产生资源泄漏。 弱指针 仅指向对象但不包含所有权的指针是弱指针。代码中如果要在多处引用同一 个对象就要用到弱指针。执行了下面这句代码之后: ObjectA *pObj2 = pObjl; PObj2是一个弱指针吗?答案是无法确定。强指针和弱指针的语义在字面上(语 法上)无法表达,全靠程序员认定和跟踪,这显然是难以把握并且极易出错的。 这句代码可以这样分析:如果认定PObj2是弱指针,则pObjl仍是强指针;如果 认定这是一个资源所有权的转移过程,则pObj2取得所有权,成为强指针,pObjl 变成了弱指针。在某一时间点,指向一个对象的强指针只可能有一个,而指向这 一对象的弱指针可以有无数个。 妍旨# 也叫悬空指针。资源被释放之后,所冇仍指向这?一对象的指针都成为野指针。 执行了这句代码之后: delete pObj 1; pObjl和pObj2都变成野指针,可以将它们清空: pObj 1 = NULL; pObj2 = NULL; 野指针成为空指针,完成了一个状态循环。资源释放后如果继续使用野指针或再 次释放资源都是严重的错误,很可能导致内存非法访问。指针的四种状态和互间 的转换关系可以用图1表示。 图1.指针状态转换图 其中“②强制清空”是不允许的,会造成资源泄漏。 对照图1总结一下编程屮可能出错的情况:指针以强指针的状态消亡或被强 制清空都会使它指向的对象永远无法访问,引起内存泄漏,所以一定不要忘记释 放资源;强指针转化为野指针后不能再引用,应马上清空,防止以后误用;而弱 指针转化为野指针的情况比较难以跟踪和觉察,因为资源是在别处释放的(强指 针状态下才能释放资源),只有从更大的范围控制程序流程才有望避免出错。 从以上分析可以看出,指向资源的指针状态变化很复杂,大量的语义细节需 要程序员跟踪和控制,难度很大,一不留神就会出错,这也就是C语言中有名 的“内存管理hell”出现的原因。 问题还不止于此,强弱指针的语义差别造成了模块与模块之间耦合度的增 大。简单的说就是模块接口中涉及的资源由谁分配由谁释放的问题必须跨越模块 协调解决。举个例子,在C语言库函数的文档中随便找一个涉及字符串的函数 的说明,一般都会有一段文字叮嘱我们调用前要分配多大的内存或者返回的内存 要由调用者释放等等。这种耦合对软件系统的设计、实现及维护都带来了不利影 响,是制约C语言开发效率提高的重要因素之一。 C++社群的探索 资源管理问题成为后来的程序设计语言需重点解决的一个问题。 在面向对象的语言中,自动化的资源管理主耍有两种解决方案,第一种是以 Eiffel和Java为代表的GC (Garbage Collection)方案。C++因为要兼容C语言, 釆用GC有一定网难,由此引入了第二种解决方案:智能指针。 智能指针是一个辅助类,它包含了普通指针用于资源管理时的功能和语义, 并尽量保持指针的接口不变,也就是说,使用起来和原来的指针差不多,最重要 的是,它增加了自动管理资源的功能,这才是它之所以被称为“智能”指针的原 因。实际上我们是把资源管理的职责从客户代码中移到了智能指针类中,见图2。 客户代码(资源管理) 指针(引用资源) 客户代码(资源管理) 指针(引用资源) 客户代码 智能指针(引用资源+资源管理) 资源a.C 资源 a.C语言中 b.引入智能指针后 图2.资源管理职责变化示意

您可能关注的文档

文档评论(0)

ggkkppp + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档