我专门写了一个MFC程序来调试检测核心模块是否有内存泄漏,核心模块是个静态库。
程序一开始启动就加载了核心模块需要的一切资源,其中有动态分配的内存。
我在stdafx.h文件中加上了CRT内存泄漏调试需要的头文件:
///////////////////////////////////////
//内存调试内存泄漏检测
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
///////////////////////////////////////
加了全局对象:
///////////////////////////////////////
//内存调试内存泄漏检测
_CrtMemState s1, s2, s3;
///////////////////////////////////////
在按钮的功能函数中:
void C内存泄漏调试Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
///////////////////////////////////////
//内存调试内存泄漏检测
_CrtMemCheckpoint( &s1 );
///////////////////////////////////////
//需要检测的方法处
//////////////////////////////////////////
//内存调试内存泄漏检测
_CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2) )
{
_CrtMemDumpStatistics( &s3 );
_CrtDumpMemoryLeaks();
}
//////////////////////////////////////////
}
按下按钮就检测两个_CrtMemCheckpoint之间的程序是否造成了内存泄漏。
如果之间什么代码(“需要检测的方法处”)都没有,那当然什么都没有输出!但是只要我加上想要检测的代码,就会输出很多程序一运行就加载资源所分配的内存!根本不是要检测的代码分配的内存!
为什么我会如此确定?因为分配那部分内存的代码只会在加载资源的时候执行,然后资源一直无变化知道程序结束。我甚至设置断点调试过,确实是只在一开始运行过一次!
请问为什么会错误的输出一开始就分配好的内存?