返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >windows下C/C++内存泄露检测的方法
  • 411
分享到

windows下C/C++内存泄露检测的方法

2023-06-15 10:06:44 411人浏览 独家记忆
摘要

小编给大家分享一下windows下C/C++内存泄露检测的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!检测内存泄露利用Visual Studio调试器和CR

小编给大家分享一下windowsC/C++内存泄露检测的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

检测内存泄露

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

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

需要以下头文件:

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

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

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

_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++内存泄露检测的方法

程序从多个位置退出时:

同样包含上述头文件

在每个会退出程序的函数(包括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\n");    _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,可以得到语句之间是否存在内存分配,从而定位出内存泄露的位置。

以上是“windows下C/c++内存泄露检测的方法”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网其他教程频道!

--结束END--

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

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

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

猜你喜欢
  • windows下C/C++内存泄露检测的方法
    小编给大家分享一下windows下C/C++内存泄露检测的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!检测内存泄露利用Visual Studio调试器和CR...
    99+
    2023-06-15
  • 详解windows下C/C++的内存泄露检测
    目录检测内存泄露定位内存泄露总结检测内存泄露 利用Visual Studio调试器和CRT库提供的检测(malloc和new均适用) 程序只从单一位置退出时: 1.需要以下头文件: ...
    99+
    2024-04-02
  • C++中如何检查内存泄露
    这篇文章给大家介绍C++中如何检查内存泄露,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、前言在Linux平台上 有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器...
    99+
    2023-06-17
  • Android LeakCanary检测内存泄露原理
    目录如何获取context 默认检测哪些类对象的内存泄露 如何将这些生命周期对象纳入监测 ActivityWatcher FragmentAndViewModelWatcher Ro...
    99+
    2024-04-02
  • C/C++实现内存泄漏检测详解
    目录内存泄漏的两个问题使用宏定义覆盖 malloc 和 free 函数使用 hook 钩子内存泄漏的两个问题 是否有内存泄漏?内存泄漏是在代码的哪一行? 检测内存泄漏主要从上面两个问...
    99+
    2023-02-09
    C++内存泄漏检测 C++内存泄漏
  • 使用Android Studio检测内存泄露(LeakCanary)
    内存泄露,是Android开发者最头疼的事。可能一处小小的内存泄露,都可能是毁千里之堤的蚁穴。 怎么才能检测内存泄露呢? AndroidStudio 中Memory控件台(显...
    99+
    2022-06-06
    Android Studio studio leakcanary Android
  • golang怎么检测内存是否泄露
    在Go语言中,可以使用内置的`runtime`包来检测内存泄漏。具体的步骤如下:1. 导入`runtime`包:```goimpor...
    99+
    2023-09-27
    golang
  • c# 内存泄露怎么查
    内存泄露是指应用程序无法释放不再使用的内存。检测 c# 内存泄露的方法包括:1. 使用 visual studio 内存分析器或 jetbrains dotmemory profiler...
    99+
    2024-05-11
    c#
  • golang函数内存泄露检测与解决
    go 语言中存在函数内存泄露,它会导致应用程序内存不断消耗和崩溃。我们可以使用 runtime/pprof 包进行检测,并检查函数是否意外保留了对不需要资源的引用。要解决内存泄露,我们需...
    99+
    2024-04-23
    golang 内存泄露
  • C#内存泄露问题分析
    这篇文章主要介绍“C#内存泄露问题分析”,在日常操作中,相信很多人在C#内存泄露问题分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#内存泄露问题分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!今天...
    99+
    2023-06-17
  • Android LeakCanary检测内存泄露原理是什么
    小编给大家分享一下Android LeakCanary检测内存泄露原理是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!以LeakCanary2.6源码分析Le...
    99+
    2023-06-14
  • Linux下c++程序内存泄漏检测代码的示例分析
    这期内容当中小编将会给大家带来有关如何解决Linux下c++程序内存泄漏检测代码,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrin...
    99+
    2023-06-17
  • Android中LeakCanary检测内存泄漏的方法
    最近要对产品进行内存泄漏的检查,最后选择了使用Square公司开源的一个检测内存泄漏的函数库LeakCanary,在github上面搜索了一下竟然有1.6w个star,并且Android大神JakeWharton也是这个开源库的贡献者。那么...
    99+
    2023-05-30
    android 内存泄漏 roi
  • C语言内存泄露很严重的解决方案
    目录1.前言2.内存泄漏问题原理2.1堆内存在C代码中的存储方式2.2堆内存的获取方法2.3内存泄漏三要素2.4内存释放误区3.内存泄漏问题检视方法1.前言 最近部门不同产品接连出现...
    99+
    2024-04-02
  • C++内存泄漏的检测与实现详细流程
    目录内存泄漏带来的问题难点hook实现泄漏判断与追踪(malloc和free重载)宏定义实现hook内存泄漏 malloc/new 调用在堆上分配的内存却没有相应的free/dele...
    99+
    2022-11-13
    C++ 内存泄漏检测 C++ 内存泄漏实现
  • android内存泄露:1、LeakCanarys内存泄漏检测库、非静态的内部类错误使用
    一、前言 今天来复习一下有关内存泄露的知识,一个是把之前笔记整理一下,如有一些工具版本更新会写一些当下的使用介绍。另外会参考网上比较好的博文进行修正改进一些知识点 二、内存泄露...
    99+
    2022-06-06
    内部类 静态 Android
  • Qt下监测内存泄漏的方法
    在写Qt应用程序时,由于是采用C++语言,经常会碰到一个令人棘手的问题,那就是内存泄漏,虽然后面C++为了防止内存泄漏,发布了智能指针以用来避免内存泄漏,但是并不能完全避免。而且智能...
    99+
    2024-04-02
  • C++技术中的内存管理:内存泄漏检测和调试技巧
    检测内存泄漏使用 valgrind 等工具检测内存泄漏。利用 ms visual studio memory profiler 识别泄漏。借助 c++++ runtime library...
    99+
    2024-05-08
    内存管理 调试技巧 c++ 标准库
  • C/C++程序调试和内存检测的方法是什么
    本篇内容主要讲解“C/C++程序调试和内存检测的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C/C++程序调试和内存检测的方法是什么”吧!1、常用的调试技巧(1)代码检查,重新阅读程...
    99+
    2023-06-05
  • PHP应用程序中的内存泄露:原因、检测和解决
    php 内存泄露是指应用程序分配内存后未能释放,导致服务器可用内存减少和性能下降。原因包括循环引用、全局变量、静态变量和扩展。检测方法有 xdebug、valgrind 和 phpuni...
    99+
    2024-05-09
    php 内存泄露 重构代码 作用域 垃圾回收器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作