如何在Linux操作系统下检测内存泄漏
3.与第二种情况相反,用户的一个实现文件调用了 new 进行内存分配工作,并使用我们定义的 DEBUG_NEW 宏。同时用户的另一个实现文件中的代码负责调用 delete 来删除前者分配的内存,但该文件没有使用 DEBUG_DELETE 宏。这种情况下,因为我们能够找到这个内存分配的原始信息,所以不会打印 warning。 4.当出现嵌套 delete(定义可见"实现上的问题")的情况下,以上第一和第三种情况都有可能打印出不正确的 warning 信息,详细分析可见"实现上的问题"一节。 你可能觉得这样的 warning 太随意了,有误导之嫌。怎么说呢?作为一个检测子系统,对待有可能的错误我们所采取的原则是:宁可误报,不可漏报。请大家"有则改之,无则加勉"。 5.动态内存泄漏信息的检测 上面我们所讲述的内存泄漏的检测能够在程序整个生命周期结束时,打印出在程序运行过程中已经在堆上分配但是没有释放的内存分配信息,程序员可以由此找到程序中"显式"的内存泄漏点并加以改正。但是如果程序在结束之前能够将自己所分配的所有内存都释放掉,是不是就可以说这个程序不存在内存泄漏呢?答案:否!在编程实践中,我们发现了另外两种危害性更大的"隐式"内存泄漏,其表现就是在程序退出时,没有任何内存泄漏的现象,但是在程序运行过程中,内存占用量却不断增加,直到使整个系统崩溃。 1.程序的一个线程不断分配内存,并将指向内存的指针保存在一个数据存储中(如 list),但是在程序运行过程中,一直没有任何线程进行内存释放。当程序退出的时候,该数据存储中的指针值所指向的内存块被依次释放。 2.程序的N个线程进行内存分配,并将指针传递给一个数据存储,由M个线程从数据存储进行数据处理和内存释放。由于 N 远大于M,或者M个线程数据处理的时间过长,导致内存分配的速度远大于内存被释放的速度。但是在程序退出的时候,数据存储中的指针值所指向的内存块被依次释放。 (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |