gpt4 book ai didi

详解windows下C/C++的内存泄露检测

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章详解windows下C/C++的内存泄露检测由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

检测内存泄露

利用Visual Studio调试器和CRT库提供的检测(malloc和new均适用) 。

程序只从单一位置退出时:

1.需要以下头文件:

#define _CRTDBG_MAP_ALLOC#include<stdlib.h>#include<crtdbg.h>

通过包含crtdbg.h,将malloc和free分别映射到_malloc_dbg和_free_dbg,用于内存分配和释放的跟踪。 #define _CRTDBG_MAP_ALLOC语句用于提供额外的信息,非绝对必要.

2.在程序退出位置前使用以下语句:

_CrtDumpMemoryLeaks();

该语句会在输出窗口显示内存泄露信息.

测试代码 。

#define _CRTDBG_MAP_ALLOC#include<stdio.h>#include<stdlib.h>#include<crtdbg.h>#define NUM 10int main(){    char *test;    test = (char*)malloc(NUM * sizeof(char));    _CrtDumpMemoryLeaks();    return 0;}

输出结果 。

使用_CRTDBG_MAP_ALLOC时:

详解windows下C/C++的内存泄露检测

未使用_CRTDBG_MAP_ALLOC时:

详解windows下C/C++的内存泄露检测

如果将程序中的:

char *test;test = (char*)malloc(NUM * sizeof(char));

替换为:

char* name = new char[10];

也会得到同样的结果(内存位置由于自动分配有所不同):

详解windows下C/C++的内存泄露检测

程序从多个位置退出时:

1.同样包含上述头文件 。

2.在每个会退出程序的函数(包括main函数)开始处包含以下代码:

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

程序会在退出时自动调用_CrtDumpMemoryLeaks();.

测试代码 。

#define _CRTDBG_MAP_ALLOC#include<stdio.h>#include<stdlib.h>#include<crtdbg.h>#define NUM 10void test1();void test2();int main(){    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);    char *test;    test = (char*)malloc(NUM * sizeof(char));    int a;    puts("input a number");    scanf_s("%d", &a, sizeof(int));    if (a > 10)        test1();    else if(a<20)        test2();    else        puts("exit point 3");    return 0;}void test1(){    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);    puts("exit point 1");    exit(EXIT_SUCCESS);}void test2(){    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);    puts("exit point 2");    exit(EXIT_SUCCESS);}

输出结果 。

详解windows下C/C++的内存泄露检测

定位内存泄露

当程序不大时,内存泄露位置可以轻易通过肉眼分辨或者代码审计发现。但是当程序较大的时候,就难以发现具体发生内存泄露的位置。此时可以通过CRT库的_CrtMenState结构储存内存状态.

使用该结构类型需要定义变量用于储存内存状态:

_CrtMenState s1,s2,s3;

检测指定位置内存需要用到_CrtMenCheckPoint结构:

_CrtMenCheckPoint(&s1);

该语句将当前位置的内存状态传递到_CrtMenState结构变量s1中.

检测两个位置之间的内存状态需要用到_CrtMenDifference()函数,同时需要一个新的_CrtMenState结构变量用于存储状态之间的差异

_CrtMemCheckpoint( &s1 );_CrtMemCheckpoint( &s2 );_CrtMemDifference( &s3, &s1, &s2);

转储_CrtMenState结构的内容需要用到_CrtMemDumpStatistics函数

_CrtMenDumpStatics(&s3);

测试代码 。

#define _CRTDBG_MAP_ALLOC#include<stdio.h>#include<stdlib.h>#include<crtdbg.h>#define NUM 10_CrtMemState s1, s2, s3;void MEM(char *str, int n);int main(){    _CrtMemCheckpoint(&s1);    char *test=NULL;    MEM(test, NUM);    _CrtMemCheckpoint(&s2);    puts("test");    _CrtMemDifference(&s3, &s1, &s2);    _CrtMemDumpStatistics(&s3);    return 0;}void MEM(char *str, int n){    str = (char*)malloc(n * sizeof(char));}

输出结果 。

当s1和s2之间调用了函数MEN()时:

详解windows下C/C++的内存泄露检测

当删去程序中的 。

MEN(test, NUM);

即s1和s2之间没有调用MEN()函数时:

详解windows下C/C++的内存泄露检测

如果单纯使用_CrtDumpMemoryLeaks();,只能显示内存分配的位置,即函数MEN()中分配内存语句的位置,而不能定位到是哪一次对函数MEN()调用导致的内存泄露,而通过结构_CrtMenState,可以得到语句之间是否存在内存分配,从而定位出内存泄露的位置.

总结

内存泄露的原因很简单,无非就是分配了内存而没有释放,为了解决这个问题,除了养成良好的习惯,还有要善用工具在编写程序的时候实时监测是否出现内存泄露,减少后期排bug时的工作量.

以上就是详解windows下C/C++的内存泄露检测的详细内容,更多关于windows下C/C++的内存泄露检测的资料请关注我其它相关文章! 。

原文链接:https://www.cnblogs.com/lsgxeva/p/12841132.html 。

最后此篇关于详解windows下C/C++的内存泄露检测的文章就讲到这里了,如果你想了解更多关于详解windows下C/C++的内存泄露检测的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com