最近写了一个从二进制文件中查找函数的库需要放到服务端,于是要解决内存泄露的问题,首先测试
添加头文件:
#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
在 mian 函数结尾使用
_CrtDumpMemoryLeaks();
测试程序:
#include <stdlib.h>
#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
int main()
{
char *a = (char*)malloc(12);
BYTE* b = new BYTE[22];
HANDLE hHeap = NULL;
__dword dwOldProtect = 0;
hHeap = GetProcessHeap();
auto c = (__void *)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 33);
_CrtDumpMemoryLeaks();
}
这里可以明显看出 HeapAlloc 出现的内存分配并没有被捕获,
添加函数:VirtualAlloc 测试一下,
char *a = (char*)malloc(12);
BYTE* b = new BYTE[22];
LPVOID c = VirtualAlloc(NULL, 27, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memset(c, 0x90, 27);
HANDLE hHeap = NULL;
__dword dwOldProtect = 0;
hHeap = GetProcessHeap();
auto d = (__void *)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 44);
_CrtDumpMemoryLeaks();
std::cout << "Hello World!\n";
发现依然是没有检测到函数的内存分配,目前只能是先测试一下 malloc 和new 分配的内存情况
在项目中使用:
添加:
_CrtDumpMemoryLeaks();
AnalyzePdb(FilePath, FilePdbInfo);
_CrtDumpMemoryLeaks();
根据提示,在设置一个断点以查找分配内存中的错误:
_CrtSetBreakAlloc(104);
_CrtDumpMemoryLeaks();
AnalyzePdb(FilePath, FilePdbInfo);
_CrtDumpMemoryLeaks();
断点成功中断下来:
查看堆栈定位未分配内存处:
发现是创建链表头处分配了内存忘记释放,至此就查找到了内存泄露的地方。