如何在LINUX下检查内存的泄露

如何在LINUX下检查内存的泄露

ID:45789976

大小:92.41 KB

页数:14页

时间:2019-11-17

如何在LINUX下检查内存的泄露_第1页
如何在LINUX下检查内存的泄露_第2页
如何在LINUX下检查内存的泄露_第3页
如何在LINUX下检查内存的泄露_第4页
如何在LINUX下检查内存的泄露_第5页
资源描述:

《如何在LINUX下检查内存的泄露》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、本文针对linux卜•的C++程序的内存泄漏的检测方法及其实现进行探讨。其中包括C++中的new和delete的基本原理,内存检测子系统的实现原理和具体方法,以及内存泄漏检测的高级话题。作为内存检测子系统实现的一部分,提供了一个具有更好的使用特性的互斥体(Mutex)类。1.开发背景:在windows卜•使用VC编程时,我们通常需要DEBUG模式下运行程序,而后调试器将在退出程序时,打印出程序运行过程屮在堆上分配而没冇释放的内存信息,其中包描代码文件名、行号以及内存大小。该功能是MFCFramework提供的内置机制,封装在其类结构体系内部。在linux或者unix下,我们的C+

2、+程序缺乏相应的手段來检测内存信息,而只能使用top指令观察进程的动态内存总额。而且程序退出时,我们无法获知任何内存泄漏信息。为了更好的辅助在linux下程序开发,我们在我们的类库项目中设计并实现了一个内存检测子系统。下文将简述C++中的new和delete的基木原理,并讲述了内存检测子系统的实现原理、实现小的技巧,并对内存泄漏检测的高级话题进行了讨论。2.New和delete的原理当我们在程序中写下new和delete时,我们实际上调用的是C++语言内置的newoperator和deleteoperatoro所谓语言内置就是说我们不能更改其含义,它的功能总是一致的。以newop

3、erator为例,它总是先分配足够的内存,而后再调用相应的类型的构造函数初始化该内存。而deleteoperator总是先调用该类型的析构函数,而后释放内存(图1)。我们能够施加影响力的事实上就是newoperator和deleteoperator执行过程屮分配和释放内存的方法。Class九=newClassA;deletep;newoperator:计算所需分画E的內存大d、分配內存处理得到的内存并调用构造函数初始化内存deleteoperator分析并调用相应的析构函数释诙內存newoperator为分配内存所调用的函数名字是operatornew,其通常的形式是void*o

4、peratornew(sizetsize);其返回值类型是void*,因为这个函数返回一个未经处理(raw)的指针,未初始化的内存。参数size确定分配多少内存,你能增加额外的参数重载函数opcmtornew,但是第一个参数类型必须是size_todeleteoperator为释放内存所调用的函数名字是operatordelete,其通常的形式是voidoperatordelete(void*memoryToBeDeallocated);它释放传入的参数所指向的一片内存区。这里有一个问题,就是当我们调用newoperator分配内存时,有一个size参数表明需要分配多大的内存。但

5、是当调用deleteoperator时,却没冇类似的参数,那么deleteoperator如何能够知道需要释放该指针指向的内存块的大小呢?答案是:对于系统自有的数据类型,语言木身就能区分内存块的大小,而对于自定义数据类型(如我们自定义的类),则operatornew和operatordeleteZ间需要互相传递信息。当我们使用operatornew为一个自定义类型对彖分配内存时,实际上我们得到的内存要比实际对彖的内存大一些,这些内存除了要存储对象数据外,还需要记录这片内存的大小,此方法称为cookieo这一点上的实现依据不同的编译器不同。(例如MFC选择在所分配内存的头部存储对象

6、实际数据,而后面的部分存储边界标志和内存大小信息。g++则采用在所分配内存的头4个口己存储相关信息,而后而的内存存储对彖实际数据。)当我们使用deleteoperator进行内存释放操作时,deleteoperator就可以根据这些信息正确的释放指针所指向的内存块。以上论述的是对于单个对象的内存分配/释放,当我们为数组分配/帑放内存时,虽然我们仍然使用newoperator和deleteoperator,但是其内部彳亍为却有不同:newoperator调用了operatornew的数组版的兄弟一operatornew[],而后针对每一个数组成员调用构造函数。而deleteoper

7、ator先对每一个数组成员调用析构函数,而后调用operatordelete[]来释放内存。需要注意的是,当我们创建或释放由自定义数据类型所构成的数组时,编译器为了能够标识HI在operatordclctc[]所需释放的内存块的大小,也使用了编译器相关的cookie技术。絆上所述,如果我们想检测内存泄漏,就必须对程序中的内存分配和释放情况进彳亍记录和分析,也就是说我们需要重载operatornew/operatornew[];operatordelete/operatordele

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

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

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