C++ 内存泄露检测方法

问题分类

编程问题

问题描述

C++程序中如何找到内存泄露点

原因分析

在编写外挂检测程序的过程中,发现程序跑起来后,内存使用一直在增加。

但是仔细查找了所有内存分配的代码,却还是没有找到泄露点。有什么简单的方法可以快速地定位泄露点呢?

解决方案

(一般应有具体的解决方案)

VC本身就带有内存检测的工具,即调试器和CRT调试堆函数。因为内存泄漏主要是由于没有释放由malloc和new分配的堆内存导致的,这两个工具对堆内存进行检测。

在C或者C++代码中添加下面的宏定义和头文件:

        #define _CRTDBG_MAP_ALLOC

        #include

        #include

引入这个宏定义和头文件后,在想检查内存泄漏情况的地方调用调试堆函数:

        _CrtDumpMemoryLeaks();

在VC++按F5运行调试,输出窗口会看到内存泄漏情况。如图所示:


从图中可以看出内存泄露的地址,泄露的长度,内存数据三个信息。但是没有具体告诉我们泄露的点。

那如何找到泄露的点呢?

我们仔细看下泄露的数据,里面有一串数据 53 83 f0 03 8b d9 b1 01 90,发现是代码中解析特征码时对应的16进制数据。

大致猜到了是哪个地方泄露的了。

再检查代码发现,代码中有delete 对象,怎么还会泄露呢?

原来在解析特征是在循环里解析的,每循环一次,都会重新分配一次内存,而原来的却没有被释放。最终释放的只是最后一次分配的内存。

这样就找到了泄露的地方。

纠正措施

将内存分配提到循环外,或者在分配时先检测是否已分配即可。

你可能感兴趣的:(点点滴滴,编程学习)