时间:2021-07-01 10:21:17 帮助过:19人阅读
? 通过包括crtdbg.h,将malloc和free函数映射到它们的调试版本,即_malloc_dbg和 _free_dbg,这两个函数将跟踪内存分配和释放。 此映射在调试版本(在其中定义了_DEBUG)中发生。 发布版本使用普通的 malloc 和 free 函数。
? #define 语句将 CRT 堆函数的基版本映射到对应的“Debug”版本。 并非绝对需要该语句;但如果没有该语句,内存泄漏转储包含的有用信息将较少。
(2)、在添加了上述语句之后,可以通过在程序中包括以下语句(通常应恰好放在程序退出位置之前)来转储内存泄漏信息:
_CrtDumpMemoryLeaks();
示例代码:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
int main(int argc,char** argv)
{
char *str = (char*)malloc(20 * sizeof(char));
_CrtDumpMemoryLeaks();
return 0;
}
?当在调试器下运行程序时(按F5),_CrtDumpMemoryLeaks将在VS最下栏 “输出”窗口 -》显示输出来源-》调试 中显示内存泄漏信息。如果没有使用#Define _CRTDBG_MAP_ALLOC语句,输出窗口则不显示内存泄漏的具体位置。
注意:
? 如果程序总是在同一位置退出,调用 _CrtDumpMemoryLeaks 将非常容易。如果程序从多个位置退出,则无需在每个可能退出的位置放置对 _CrtDumpMemoryLeaks 的调用,而可以在程序开始处包含以下调用:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
?该语句在程序退出时自动调用 _CrtDumpMemoryLeaks。必须同时设置 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF两个位域。
示例代码:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
int main(int argc,char** argv)
{
char *str = (char*)malloc(20 * sizeof(char));
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
return 0;
}
或
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
void check_mem()
{
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
}
int main(int argc,char** argv)
{
char *str = (char*)malloc(20 * sizeof(char));
atexit(check_mem);
return 0;
}
注:上述方法在测试调用的第三方库是否存在内存泄漏时,并不能显示泄露函数在哪个文件、哪一行,只会简单的显示,如:
Detected memory leaks!
Dumping objects ->
{223} normal block at 0x003CF650, 4 bytes long.
Data: < < > E8 F6 3C 00
此时,需要在程序的入口处加入:
_CrtSetBreakAlloc(223);
在vs中按F5调试,在堆栈信息中就可以看到泄露的具体位置。其中223表示{223} normal block at 0x003CF650, 4 bytes long.
参考网址:https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx
参考网址:https://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html
from:https://blog.csdn.net/listener51/article/details/104417475?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-7.control
【内存检测系列】window下windbg内存泄漏检查
标签:ring pat 名句 asp txt 注意 ges 开头 keyword