- 5
- 0
- 约1.34万字
- 约 16页
- 2017-03-05 发布于重庆
- 举报
寻找理想的智能指针-C资源管理综述
寻找理想的智能指针-C++资源管理综述
摘要:C++中的资源管理历来是比较令人头痛的问题,随着C++0x标准的酝酿,这一问题再次引起了人们的关注。本文将和您一道对C++中的资源管理方式进行回顾,分析与展望,并探讨理想的智能指针应该满足哪些条件。
C的时代
C语言中用指针来表示对资源的引用,这里的资源包括动态内存(堆内存)及同步对象,文件对象等由操作系统抽象出来的对象。有的操作系统中用句柄(handle)表示对这类对象的引用,其语义与指针是相同的。下文中提到的对象如不加说明,一般均指资源对象。
一个用于引用资源的指针(其它的指针,比如指向局部变量的指针或指向指针的指针,这里不予研究)从产生到消亡的整个生存期中可能处于以下四种状态:
空指针
所有指针刚产生时的初始状态都是空指针。C语言中作为局部变量的指针初始状态下包含的值是随机的,但它没有额外的语义,其实质还是空指针,程序员应该显式将其初始化为空,以防止误用。
强指针
强指针是指向某一对象并对其拥有所有权的指针。资源产生后其引用需保存在一个指针中,这个指针这时就是强指针,执行下面的代码后:
ObjectA *pObj1 = NULL;
pObj1 = new ObjectA;
pObj1就成为强指针。资源的所有权可以转移,其表现形式为指针赋值。在强指针的生存期结束之前,它所指向的资源需要被释放,否则会产生资源泄漏。
弱指针
仅指向对象但不包含所有权的指针是弱指针。代码中如果要在多处引用同一个对象就要用到弱指针。执行了下面这句代码之后:
ObjectA *pObj2 = pObj1;
pObj2是一个弱指针吗?答案是无法确定。强指针和弱指针的语义在字面上(语法上)无法表达,全靠程序员认定和跟踪,这显然是难以把握并且极易出错的。这句代码可以这样分析:如果认定pObj2是弱指针,则pObj1仍是强指针;如果认定这是一个资源所有权的转移过程,则pObj2取得所有权,成为强指针,pObj1变成了弱指针。在某一时间点,指向一个对象的强指针只可能有一个,而指向这一对象的弱指针可以有无数个。
野指针
也叫悬空指针。资源被释放之后,所有仍指向这一对象的指针都成为野指针。执行了这句代码之后:
delete pObj1;
pObj1和pObj2都变成野指针,可以将它们清空:
pObj1 = NULL;
pObj2 = NULL;
野指针成为空指针,完成了一个状态循环。资源释放后如果继续使用野指针或再次释放资源都是严重的错误,很可能导致内存非法访问。指针的四种状态相互间的转换关系可以用图1表示。
其中“②强制清空”是不允许的,会造成资源泄漏。
对照图1总结一下编程中可能出错的情况:指针以强指针的状态消亡或被强制清空都会使它指向的对象永远无法访问,引起内存泄漏,所以一定不要忘记释放资源;强指针转化为野指针后不能再引用,应马上清空,防止以后误用;而弱指针转化为野指针的情况比较难以跟踪和觉察,因为资源是在别处释放的(强指针状态下才能释放资源),只有从更大的范围控制程序流程才有望避免出错。
从以上分析可以看出,指向资源的指针状态变化很复杂,大量的语义细节需要程序员跟踪和控制,难度很大,一不留神就会出错,这也就是C语言中有名的“内存管理hell”出现的原因。
问题还不止于此,强弱指针的语义差别造成了模块与模块之间耦合度的增大。简单的说就是模块接口中涉及的资源由谁分配由谁释放的问题必须跨越模块协调解决。举个例子,在C语言库函数的文档中随便找一个涉及字符串的函数的说明,一般都会有一段文字叮嘱我们调用前要分配多大的内存或者返回的内存要由调用者释放等等。这种耦合对软件系统的设计、实现及维护都带来了不利影响,是制约C语言开发效率提高的重要因素之一。
C++社群的探索
资源管理问题成为后来的程序设计语言需重点解决的一个问题。
在面向对象的语言中,自动化的资源管理主要有两种解决方案,第一种是以Eiffel和Java为代表的GC(Garbage Collection)方案。C++因为要兼容C语言,采用GC有一定困难,由此引入了第二种解决方案:智能指针。
智能指针是一个辅助类,它包含了普通指针用于资源管理时的功能和语义,并尽量保持指针的接口不变,也就是说,使用起来和原来的指针差不多,最重要的是,它增加了自动管理资源的功能,这才是它之所以被称为“智能”指针的原因。实际上我们是把资源管理的职责从客户代码中移到了智能指针类中,见图2。
智能指针在即将超出作用域时会自动释放所拥有的资源,指向新的资源以前也会把原来拥有的资源先释放掉,用户代码中不需要再考虑资源管理,可以简化用户代码并防止资源泄漏;智能指针释放资源后
您可能关注的文档
最近下载
- 化工安全技术与环境保护 教学课件 作者 刘景良 主编 第七章化工装置安全检修.ppt VIP
- 党工委书记2025年度组织生活会个人对照检查材料(五个对照).docx VIP
- 吉林省风电场信息表.doc VIP
- 22J603-1 铝合金门窗(建筑图集).docx
- 化工安全技术与环境保护 教学课件 作者 刘景良 主编 第六章电气安全与静电防护技术.ppt VIP
- 冠林AH3000安装调试手册.pdf
- 山西省临汾市2025-2026年七年级上历史期末试卷.docx VIP
- 2025年3月电子学会青少年软件编程(scratch二级)等级考试试卷-编程题-附答案.pdf
- 2025年新疆职业大学单招笔试英语试题库含答案解析.docx VIP
- 党务培训课件.ppt VIP
原创力文档

文档评论(0)