c编程中减少内存缺陷的工具和方法

c编程中减少内存缺陷的工具和方法

ID:5417394

大小:159.96 KB

页数:4页

时间:2017-12-10

c编程中减少内存缺陷的工具和方法_第1页
c编程中减少内存缺陷的工具和方法_第2页
c编程中减少内存缺陷的工具和方法_第3页
c编程中减少内存缺陷的工具和方法_第4页
资源描述:

《c编程中减少内存缺陷的工具和方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、C++编码中减少内存缺陷的方法和工具程振林,方金云,唐志敏(中国科学院计算技术研究所,北京100080)摘要:基于C++的软件的缺陷和错误大部分都和内存相关,预防、发现、消除代码中和内存相关的缺陷,成为程序员编写、调试、维护代码时的重要任务。该文基于“面向网络海量空间信息的大型GIS”课题的工程实践,提出和总结了如何使用C++语言机制、开发环境和相关质量保证工具来预防、发现各种编译期、运行期内存缺陷的方法和工具。关键词:C++;内存错误;内存泄漏;质量保证C++语言是桌面系统,尤其是系统软件、大型应用软件的主流开发语言。C++语言以其灵活性著称,同时也更复杂。利用C++编写健壮的

2、代码,更具有挑战性。C++允许动态内存管理,同时也容易导致更多和内存相关的问题。一般而言,除了系统设计上的缺陷,基于C++的软件的缺陷和错误大部分都和内存缺陷(主要包括内存访问错误和内存泄漏两类)相关。所以,消除代码中的内存相关缺陷,成为程序员编写、调试、维护代码中的任务,也是保证软件质量的关键。本文的工作基于“863”计划项目“面向网络海量空间信息的大型GIS”课题。该系统是基于C++/MFC编写,开发环境是VisualStudio.net2003。本文基于此项目的工程实践,总结了如何使用C++语言机制、开发环境和相关质量保证工具来预防、发现各种编译期、运行期和内存相关的缺陷的

3、方法和工具。1遵循C++相关的编码规范和惯用法,预防缺陷编码规范是语言相关的规则,是经过实践总结出来的经验。良好的编程标准将有效地帮助开发人员避免开发有潜在危险的代码。一般来说,为了减少内存缺陷,应该遵循下列编码规则[1]:(1)基类或者带有虚函数的类应该将其析构函数声明为虚函数。(2)在构造函数中防止内存泄漏,在析构函数中不要抛出异常。(3)使用对应形式的new和delete。即:用delete来释放new申请的内存,delete[]释放new[]申请的内存。(4)指针在使用前必须初始化,指向动态内存的指针在释放后应立即置为空。(5)如果类构造函数中分配了资源,那么需要显式提供

4、拷贝构造函数和赋值操作符,并且在析构函数中释放资源。值得重视的是C++中的惯用法RAII。RAII核心思想是利用对象来管理资源,在对象的构造函数中获取资源,在其析构函数中释放资源[2]。为了保证动态申请的内存能在即使出现异常的情况下仍能释放,比较理想的方法是使用局部变量来管理动态内存的所有权(ownership),就是所谓的智能指针。STL中的auto_ptr就是为解决资源所有权问题设计的,但是缺少对引用数和数组的支持并且不能用在STL容器中。Boost库[3]提供的智能指针相对成熟,实用价值高。其中,shared_ptr线程安全并且可以用在STL容器中。具体示例参考文献[3]。

5、1.1编码规范检查工具CodeWizardCodeWizard能够对源程序直接进行自动扫描、分析和检查。一旦发现违例,产生信息告知与哪条规则不符并作出解释。以CodeWizard4.3为例,其中内置了超过500条编码标准。CodeWizard可以选择对于当前的工程执行哪些编码标准。CodeWizard可以和VC++紧密集成,安装完毕以后,VC++中有CodeWizard工具条。1.2代码检查工具PC-LintPC-Lint可检查编译器不易发现的错误。PC-Lint可对100多个C库函数进行检查,可以发现标准C/C++代码中的1000多个常见错误。要把PC-lint和VisualS

6、tudio集成在一起,需要自己配置。JonZyzyck提供了一个报告生成器,可以帮助完成这个工作。可在http://www.ddj.com下载。文献[4]说明了如何在VC++环境中集成PC-Lint。2利用语言机制、开发环境和相关工具以预防和发现内存缺陷发现问题是解决问题的前提。相对于修复内存缺陷,发现内存缺陷并准确定位导致缺陷的代码更为费时费力。及早准确地发现内存缺陷,对于提高开发效率非常重要。2.1利用断言及早暴露内存缺陷断言是布尔调试语句,用来检测在程序运行的时候某一条件的值是否总为真。断言经常用来确认函数的输入、输出,检查对象的当前状态是否合法等。在以下的场景使用断言可以

7、帮助发现和内存非法访问相关的错误:(1)验证指针是否可读/写。在函数的入口处,经常需要验证指针所指向的内容区域是否可读/写。通常采用assert(p!=NULL)的检测形式。但是,指针的值不为空并不代表指针指向了合法可读/写内存。Win32API提供了函数IsBadReadPtr、IsBadWritePtr、IsBadStringPtr、IsBadCodePtr用来检测指针指向的内存区域是否可读/写。C运行时库提供了_CrtIsValidPointer、_CrtIsValidHe

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。