之前的日子一直在做一项甚是无聊的事情,将用M语言写成的代码改成C++语言版本的。不可避免的问题便是常常出现内存泄漏,因为动态分配内存无处不在。刚开始的时候,还能一个malloc一个free的仔细检查。直到最近,一个程序折腾了两天没有任何进展,不得不去网上找点资料,功夫不负有心人,最终在MSDN里找到了相关的 —— 内存泄漏检测和隔离。
正如资料中提到的, 在程序中包括下面的语句,启用调试堆函数
在程序结尾处包含语句_CrtDumpMemoryLeaks();在输出窗口显示内存泄漏信息。
按下F5启动调试,在输出窗口得到如下的内存泄漏信息。很奇怪为什么没有显示泄漏内存的文件和行号~所幸的是,通过内存编号还是能够找到的。
从中可以看到,分配的第一块内存编号为497,也就是说分配的这块内存没有被释放。在程序中包含语句_CrtSetBreakAlloc(497);
这样在调试环境下,当程序分配这块内存的时就会中断,
点击中断按钮,查看调用堆栈,即查看是哪段代码申请分配内存。既然要分配内存,当然有一个分配内存的函数,这是函数就是Memory_Malloc(int M, int N),那么是谁调用了这个函数呢?这就得查看调用堆栈了。从中可以看到是FindMinPoint_F(……)调用了内存分配函数。
双击FindMinPoint_F(……)就可以定位到代码中分配内存的那一行语句。 这下就知道了分配的内存给了F,剩下的工作就是查看程序中是否正确释放了分配给F的内存。
检查后发现确实没有释放。PS:这里为了说明如何检测,遂将其注释掉了。
评论