iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解windows下C/C++的内存泄露检测
  • 763
分享到

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

2024-04-02 19:04:59 763人浏览 泡泡鱼
摘要

目录检测内存泄露定位内存泄露总结检测内存泄露 利用Visual Studio调试器和CRT库提供的检测(malloc和new均适用) 程序只从单一位置退出时: 1.需要以下头文件:

检测内存泄露

利用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 10

int main()
{
    char *test;
    test = (char*)malloc(NUM * sizeof(char));
    _CrtDumpMemoryLeaks();
    return 0;
}

输出结果

使用_CRTDBG_MAP_ALLOC时:

未使用_CRTDBG_MAP_ALLOC时:

如果将程序中的:


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

替换为:


char* name = new char[10];

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

程序从多个位置退出时:

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 10

void 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);
}

输出结果

定位内存泄露

当程序不大时,内存泄露位置可以轻易通过肉眼分辨或者代码审计发现。但是当程序较大的时候,就难以发现具体发生内存泄露的位置。此时可以通过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\n");
    _CrtMemDifference(&s3, &s1, &s2);
    _CrtMemDumpStatistics(&s3);
    return 0;
}

void MEM(char *str, int n)
{
    str = (char*)malloc(n * sizeof(char));
}

输出结果

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

当删去程序中的


MEN(test, NUM);

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

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

总结

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

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

--结束END--

本文标题: 详解windows下C/C++的内存泄露检测

本文链接: https://www.lsjlt.com/news/127899.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解windows下C/C++的内存泄露检测
    目录检测内存泄露定位内存泄露总结检测内存泄露 利用Visual Studio调试器和CRT库提供的检测(malloc和new均适用) 程序只从单一位置退出时: 1.需要以下头文件: ...
    99+
    2022-11-12
  • windows下C/C++内存泄露检测的方法
    小编给大家分享一下windows下C/C++内存泄露检测的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!检测内存泄露利用Visual Studio调试器和CR...
    99+
    2023-06-15
  • C/C++实现内存泄漏检测详解
    目录内存泄漏的两个问题使用宏定义覆盖 malloc 和 free 函数使用 hook 钩子内存泄漏的两个问题 是否有内存泄漏?内存泄漏是在代码的哪一行? 检测内存泄漏主要从上面两个问...
    99+
    2023-02-09
    C++内存泄漏检测 C++内存泄漏
  • C++中如何检查内存泄露
    这篇文章给大家介绍C++中如何检查内存泄露,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、前言在Linux平台上 有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器...
    99+
    2023-06-17
  • C++内存泄漏的检测与实现详细流程
    目录内存泄漏带来的问题难点hook实现泄漏判断与追踪(malloc和free重载)宏定义实现hook内存泄漏 malloc/new 调用在堆上分配的内存却没有相应的free/dele...
    99+
    2022-11-13
    C++ 内存泄漏检测 C++ 内存泄漏实现
  • Linux下c++程序内存泄漏检测代码的示例分析
    这期内容当中小编将会给大家带来有关如何解决Linux下c++程序内存泄漏检测代码,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrin...
    99+
    2023-06-17
  • C语言内存泄露很严重的解决方案
    目录1.前言2.内存泄漏问题原理2.1堆内存在C代码中的存储方式2.2堆内存的获取方法2.3内存泄漏三要素2.4内存释放误区3.内存泄漏问题检视方法1.前言 最近部门不同产品接连出现...
    99+
    2022-11-13
  • C++之内存泄漏排查详解
    目录一 、经验排查二 、使用Visual Leak Detector for Visual C++2.1 Visual Leak Detector for Visual C++简介2...
    99+
    2022-11-12
  • 详解Android内存泄漏检测与MAT使用
    内存泄漏基本概念 内存检测这部分,相关的知识有JVM虚拟机垃圾收集机制,类加载机制,内存模型等。编写没有内存泄漏的程序,对提高程序稳定性,提高用户体验具有重要的意义。因此,学习...
    99+
    2022-06-06
    mat android内存泄漏 Android
  • android内存泄露:1、LeakCanarys内存泄漏检测库、非静态的内部类错误使用
    一、前言 今天来复习一下有关内存泄露的知识,一个是把之前笔记整理一下,如有一些工具版本更新会写一些当下的使用介绍。另外会参考网上比较好的博文进行修正改进一些知识点 二、内存泄露...
    99+
    2022-06-06
    内部类 静态 Android
  • c++循环引用导致的内存泄露如何解决
    在 C++ 中,循环引用(circular reference)是指两个或多个对象相互引用,导致内存泄漏的情况。解决循环引用导致的内...
    99+
    2023-10-10
    c++
  • C语言动态内存泄露常见问题内存分配改进方法详解
    目录一、例题二、2种改进方法法1:二级指针(传址调用)法2:返回指针总结一、例题 试问该段代码能打印什么,或者不能打印什么,说出理由 #define _CRT_SECURE_NO...
    99+
    2022-11-12
  • Java语言中的内存泄露代码详解
    Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存。理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同。JAVA中的内存管理...
    99+
    2023-05-30
    java 内存泄露 实例
  • Python实现内存泄露排查的示例详解
    一般情况下只有需要长期运行的项目才会去关注内存的增长情况,即使是很小部分的内存泄露经过长期的运行仍然会产生很大的隐患。 python本身也是支持垃圾的自动回收的,但是在特定的情况下也...
    99+
    2023-01-28
    Python内存泄露排查 Python内存泄露 Python内存
  • C/C++程序调试和内存检测的方法是什么
    本篇内容主要讲解“C/C++程序调试和内存检测的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C/C++程序调试和内存检测的方法是什么”吧!1、常用的调试技巧(1)代码检查,重新阅读程...
    99+
    2023-06-05
  • C++的内存管理详细解释
    目录一、C/C++内存分布二、C语言中动态内存管理方式:1、malloc/calloc/realloc区别:三、C++中动态内存管理:new/delete四、实现原理五、面试常问问题...
    99+
    2022-11-12
  • c语言内存泄漏的解决方法是什么
    在C语言中,内存泄漏是指在动态内存分配后,没有释放该内存导致内存空间无法被再次使用的情况。解决内存泄漏的方法可以包括以下几个方面:1...
    99+
    2023-09-27
    c语言
  • C++手写内存池的案例详解
    引言 使用new expression为类的多个实例分配动态内存时,cookie导致内存利用率可能不高,此时我们通过实现类的内存池来降低overhead。从不成熟到巧妙优化的内存池,...
    99+
    2022-11-12
  • C++ 使用CRC32检测内存映像完整性的实现步骤
    目录仅对.text代码段进行校验:仅对.text代码段进行校验: 通常程序中至少包括了代码段,数据段,而数据段中所存储的数据是经常会发生变动的,例如我们的全局变量,静态变量等都会默认...
    99+
    2022-11-12
  • C++中内存泄漏问题的分析与解决方案
    C++中内存泄漏问题的分析与解决方案概述:内存泄漏是指程序在动态分配内存后,没有及时释放导致内存无法再被程序使用的情况。在C++开发中,内存泄漏是一个常见且严重的问题,一旦发生,会导致程序运行效率下降,最终可能导致程序崩溃。本文将对C++中...
    99+
    2023-10-22
    分析(Analysis) 解决方案(Solution) 内存泄漏(Memory Leak)
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作