- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
简介
本文介绍了IBM Rational Purify的基本概念和在不同操作系统中使用Purify对C/C++源程序中存在的内存问题进行勘察和分析,并且提供了有关的实例以便读者在实际操作中作为参考。
回页首
1.内存问题的原因及分类
在C/C++程序中,有关内存使用的问题是最难发现和解决的。这些问题可能导致程序莫名其妙地停止、崩溃,或者不断消耗内存直至资源耗尽。由于C/C++语言本身的特质和历史原因,程序员使用内存需要注意的事项较多,而且语言本身也不提供类似Java的垃圾清理机制。编程人员使用一定的工具来查找和调试内存相关问题是十分必要的。
总的说来,与内存有关的问题可以分成两类:内存访问错误和内存使用错误。内存访问错误包括错误地读取内存和错误地写内存。错误地读取内存可能让你的模块返回意想不到的结果,从而导致后续的模块运行异常。错误地写内存可能导致系统崩溃。内存使用方面的错误主要是指申请的内存没有正确释放,从而使程序运行逐渐减慢,直至停止。这方面的错误由于表现比较慢很难被人工察觉。程序也许运行了很久才会耗净资源,发生问题。
1.1 内存解剖
一个典型的C++内存布局如下图所示:
自底向上,内存中依次存放着只读的程序代码和数据,全局变量和静态变量,堆中的动态申请变量和堆栈中的自动变量。自动变量就是在函数内声明的局部变量。当函数被调用时,它们被压入栈;当函数返回时,它们就要被弹出堆栈。堆栈的使用基本上由系统控制,用户一般不会直接对其进行控制,所以堆栈的使用还是相对安全的。动态内存是一柄双刃剑:它可以提供程序员更灵活的内存使用方法,而且有些算法没有动态内存会很难实现;但是动态内存往往是内存问题存在的沃土。
1.2 内存访问错误
相对用户使用的语言,动态内存的申请一般由malloc/new来完成,释放由free/delete完成。基本的原则可以总结为:一对一,不混用。也就是说一个malloc必须对应一且唯一的free;new对应一且唯一的delete; malloc不能和delete, new不能和free对应。另外在C++中要注意delete和delete[]的区别。delete用来释放单元变量,delete[]用来释放数组等集聚变量。有关这方面的详细信息可以参考[C++Adv]。
我们可以将内存访问错误大致分成以下几类:数组越界读或写、访问未初始化内存、访问已经释放的内存和重复释放内存或释放非法内存。
下面的代码集中显示了上述问题的典型例子:
1 #include iostream
2 using namespace std;
3 int main(){
4 char* str1=four;
5 char* str2=new char[4]; //not enough space
6 char* str3=str2;
7 coutstr2endl; //UMR
8 strcpy(str2,str1); //ABW
9 coutstr2endl; //ABR
10 delete str2;
11 str2[0]+=2; //FMR and FMW
12 delete str3; //FFM
13 }
由以上的程序,我们可以看到:在第5行分配内存时,忽略了字符串终止符\0所占空间导致了第8行的数组越界写(Array Bounds Write)和第9行的数组越界读(Array Bounds Read); 在第7行,打印尚未赋值的str2将产生访问未初始化内存错误(Uninitialized Memory Read);在第11行使用已经释放的变量将导致释放内存读和写错误(Freed Memory Read and Freed Memory Write);最后由于str3和str2所指的是同一片内存,第12行又一次释放了已经被释放的空间 (Free Freed Memory)。
这个包含许多错误的程序可以编译连接,而且可以在很多平台上运行。但是这些错误就像定时炸弹,会在特殊配置下触发,造成不可预见的错误。这就是内存错误难以发现的一个主要原因。
1.3 内存使用错误
内存使用错误主要是指内存泄漏,也就是指申请的动态内存没有被正确地释放,或者是没有指针可以访问这些内存。这些小的被人遗忘的内存块占据了一定的地址空间。当系统压力增大时,这些越来越多的小块将最终导致系统内存耗尽。内存使用错误比内存访问错误更加难以发现。这主要有两点原因:第一,内存使用错误是慢性病,它的症状可能不会在少数、短时间的运行中体现;第二,内存使用错误是因为不做为(忘记释放内存)而不是做错造成的。这样由于忽略造成的错误在检查局部代码时很难发现,尤其是当系统相当复杂的时候。
您可能关注的文档
- 213测电源电动势和内阻探索.ppt
- 经典作文素材研究.doc
- 经济管理学院2017届毕业论文研究.doc
- 经济学作业研究.doc
- 晶科综合楼施工组织设计研究.doc
- 《滴水穿石的启示》6答辩.ppt
- 井下机电精细化管理规定研究.doc
- maya破碎剖析.docx
- Modbusvb源程序(可以读写寄存器)剖析.docx
- oracle查询命令剖析.docx
- 09G103民用建筑工程结构施工图设计深度图集.pdf
- DB22T3442-2023 小冰麦安全优质生产技术规程.pdf
- 《建筑给水排水与节水通用规范GB+55020-2021》详细解读.pdf
- 《液化石油气瓶阀gb+7512-2023》详细解读.pdf
- 第七讲推动构建新时代的大国关系格局.pdf
- 危险废物识别标志设置专题培训.pdf
- 2024年秋季学期形势与政策 第四讲 下好区域协调发展这盘棋.pdf
- 人教版小学数学六年级下册总复习知识点结构图专题名师优质课获奖市赛课一等奖课件.ppt
- 初中生物七上第二单元2.4生物对环境的适应市公开课一等奖省优质课赛课一等奖课件.pptx
- 新人教版六年级下册数学有趣的平衡省名师优质课赛课获奖课件市赛课一等奖课件.ppt
文档评论(0)