C++调试内存泄漏

调试C/C++程序中的内存泄漏问题 内存泄漏是编程中常见的问题之一,特别是在使用C/C++这类需要手动管理内存的编程语言时。内存泄漏指的是在分配内存后,没有及时释放或者无法释放已分配的内存,导致程序运行时内存占用不断增加,最终耗尽可用内存。然而,需要注意的是,内存泄漏并非只存在于动态内存分配的情况下,还可能出现在其他场景中,如资源未正确释放、循环引用等。因此,在编程过程中,及时释放不再使用的资源是一个良好的编程习惯,有助于减少内存泄漏的发生。智能指针能够在对象不再使用时自动释放相关的内存,避免了手动管理内存的麻烦和可能的遗漏。 阅读详情

笔记:之前研究过如何定位内存泄漏,太长时间不用又忘记了,今天把它记下来!
学而时习之

内存泄漏的原因

C++和其他高级语言不同,需要自行管理内存,项目大\调用多,容易内存泄漏.内存申请释放使用malloc/free和new delete两种方式。
有经验的程序员会对程序中申请内存的地方进行排查,例如malloc或者new关键字的地方进行跟踪,一种情况是我们按照程序逻辑进行了申请和释放,要提防程序在发生异常时没有如我们所期望的那样进行内存释放,此时也应当防止内存泄漏。

排查方法

windows CRT调试(Find memory leaks with the CRT library)

这是最方便的方法。
官方有详细使用描述:官网链接:Find memory leaks with the CRT Library - Visual Studio (Windows) | Microsoft Docs
使用案例:

// debug_new.cpp
// compile by using: cl /EHsc /W4 /D_DEBUG /MDd debug_new.cpp
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
 
#ifdef _DEBUG
    #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
    // Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the
    // allocations to be of _CLIENT_BLOCK type
#else
    #define DBG_NEW new
#endif
 
struct Pod {
    int x;
};
 
void main() {
    Pod* pPod = DBG_NEW Pod;
    pPod = DBG_NEW Pod; // Oops, leaked the original pPod!
    delete pPod;
 
    _CrtDumpMemoryLeaks();//直接打印内存泄漏信息
}

定位更加准确的地址

//#ifdef _DEBUG
//#define  DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
//#else
//#define  DEBUG_CLIENTBLOCK
//#endif
//#define _CRTDBG_MAP_ALLOC
//#include <stdlib.h>
//#include <crtdbg.h>
//#ifdef _DEBUG
//#define  new DEBUG_CLIENTBLOCK
//#endif
 
//_CrtMemState s1,s2,s3;
 
//_CrtMemCheckpoint(&s1);//记录s1处内存数据
//to do something
//_CrtMemCheckpoint(&s2);//记录s1处内存数据
 
//if (_CrtMemDifference(&s3, &s1, &s2))
//	_CrtMemDumpStatistics(&s3);//内存泄漏,两处内存数据不一致,差异结果返回至s3,打印信息

VS2019自带的诊断工具,可在程序运行时打开诊断工具窗口-----》勾选内存使用率----》启用堆栈快照

VS2019自带的诊断工具,可在程序运行时打开诊断工具窗口-----》勾选内存使用率----》启用堆栈快照
在这里插入图片描述在这里插入图片描述
类型视图能根据各种差异,点击左侧箭头所指的视图实例,可准确定位内存泄漏发生点。

VLD(Visual Leak Detector)

简介

Visual C++ 提供了内置的内存泄漏检测,但它的功能充其量只是最小的。此内存泄漏检测器是作为 Visual C++ 提供的内置内存泄漏检测器的免费替代品而创建的。以下是 Visual Leak Detector 的一些功能,内置检测器中不存在这些功能:
为每个泄漏块提供完整的堆栈跟踪,包括可用的源文件和行号信息。

检测大多数(如果不是全部)进程内内存泄漏类型,包括基于 COM 的泄漏和基于纯 Win32 堆的泄漏。

选定的模块(DLL 甚至主 EXE)可以从泄漏检测中排除。

提供泄漏块的完整数据转储(以十六进制和 ASCII 格式)。

可定制的内存泄漏报告:可以保存到文件或发送到调试器,并且可以包含可变级别的详细信息。

其他用于 Visual C++ 的售后泄漏检测器已经可用。但大多数真正流行的,如 Purify 和 BoundsChecker,都非常昂贵。存在一些免费的替代方案,但它们通常太具有侵入性、限制性或不可靠。 Visual Leak Detector 是目前唯一可免费使用的 Visual C++ 内存泄漏检测器,它将上述所有专业级功能整齐地打包在一个易于使用的库中

如何测试自己的项目呢

在自己的工程中引入vld.h文件,并在链接库中配置vld.lib库
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
设置当前工程为Debug模式,才能显示堆栈相关的调用信息
在这里插入图片描述#### 例子

#include<stdlib.h>
#include<stdio.h>
#include <iostream>
#include <vld.h>
#include "three.h"
using namespace std;
 class three
{
public:
    three(){};
    ~three(){};
};
int main()
{
    cout << "vld test begin" << endl;
    int *one = new int[30];
    char *two = new char[40];
    three * tmp = new three();
    return 0;
}

在这里插入图片描述程序执行完之后会在终端显示内存泄漏的的个数,并同时会打印相关的内存泄漏的堆栈信息,当鼠标点击终端信息输出的位置时,同时会在上方代码指示哪一行出现内存泄漏。

参考资料

https://www.jb51.net/article/224934.htm

在网上看到的一种有趣的自己排查的方法

https://www.jb51.net/article/246468.htm
通过联想到内存的申请释放方式,申请和释放总是配对的,申请的大小也是预先知道的.**在内存申请申请释放的时候加上内存地址打印,当内存泄漏报错的时候就可以定位出错内存地址在哪个范围.**我加入了一个内存打印函数,把内存地址范围和时间都打印出来.

void DebugHeap(CString name, void * ptr,int size)
{
    long Time = GetCurrentTime();
    TRACE("========>heap name:%s,address [%p:%p],time:%d (ms)\n", name,ptr,(char *)ptr + size,Time);
}

哈哈哈其实和系统提供的方法是相似的,凭借自己想到还是挺厉害的,但是不推荐。

显存检测工具(N+A) 从网上搜罗的显存检测软件,N卡系的8,9验证无问题。其他部分未经过验证,不能保证100%可以使用。敬请知悉。 立即下载

相关推荐

专业的显存测试软件

专业的显存测试软件 可以测试显卡的显存 效果非常好

关于C++解决内存泄漏问题的心得

内存泄漏定位、监测工具、new、delete、malloc、free、分块注释 asan(AddressSanitizer)、Sonarqube、vscode-cppcheck插件等;内存监测工具(linux):top、Telegraf+Influxdb+Grafana三件套。

m0_37635769的博客 1705

Claude Code + 自定义模型体验

AI 编程工具的发展突飞猛进:Cursor 横空出世,推出了“Agent 模式”;新竞争者如 Windsurf 也纷纷加入战局。几乎所有产品都开始转向“代理式(agentic)”开发模式——不再依赖单次 LLM 响应进行补全,而是让大模型在一个循环中调用各种工具,来完成更复杂的任务:分析代码库上下文、读取网页与文档、编译程序、运行测试、修复失败构建或测试、不断迭代等。

西京刀客 5802

C/C++ 内存泄漏-原因、避免以及定位

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成段错误(segment fault)或者内存泄漏(memory leak)。 今天,借助此文,分析下项目中经常遇到的导致内存泄漏的原因,以及如何避免和定位内存泄漏。 主要内容如下: C/C++语言中,内存的分配与回收都是由开发人员在编写代码时主动完成的,好处是内存管理的开销较小,程序拥有更高的

weixin_60596960的博客 1万+

我从华为身上学到的项目管理经验 -- 需求篇

记录这三年,关于项目管理上的一些心得体会 – 需求篇对于需求,我们可以根据不同的角色、理解拆分成三个过程:简单来说就是:需求分析原始需求、 需求拆分为系统需求、 需求实现为功能需求**需求分析**: 将客户需求 输出成 需求描述。 需求经理需要把 需求 转换成 客户能够接受的 初始需求 IR(Initial Requirement) 对于用户来说,我只管提 我的原始需求是

minminzhe520的博客 3万+

游戏脚本开发避坑:Python调用OP模块实现阴阳师后台操作的5个关键点

本文深入探讨了使用Python调用OP模块开发《阴阳师》后台自动化脚本的5个核心避坑点。重点解析了窗口绑定、后台截图与图像识别、鼠标键盘模拟、脚本稳定性以及性能优化等关键环节的常见问题与实战解决方案,帮助开发者高效实现稳定的游戏后台挂机功能。

u0v1w2x3的博客 591

内存调试#define new DEBUG_NEW

在用vc时,利用AppWizard会产生如下代码: #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif

SunStone的小屋 1182

ADS笔记,新旧两组仿真数据进行绘图和列表对比

原理图器件参数的不同,怎么进行对比观看,操作如下。

彭辉荣的博客 3870

C++调试内存泄漏问题总结

提示:本文是在学习完模板后,编写可变长度数组时,调试出现的问题,问题集中在内存泄漏上,可供大家学习借鉴。 文章目录基本的思路及程序功能一、源程序二、部分重要的头文件三、调试出现的问题及原因分析四、如何修改总结 基本的思路及程序功能 1、数组是一些连续的内存空间上存放了一些相同数据类型的一种“容器”,为了实现代码的可重复使用,可以借助模板来完成自定义的数组类。 2、同时,使用尾部插入数据时,为了提高空间使用效率,不需要每次插入一个元素时,就在堆区重新new出old_length+1的内存空间,而采用了直接

weixin_37819514的博客 536

【TRAE调教指南之MCP篇】构建高效AI编程的七大MCP服务配置实战

【TRAE调教指南之MCP篇】构建高效AI编程的七大MCP服务配置实战

funfan的博客 2775

基于FPGA的以太网设计(1)----大白话解释什么是以太网

基于FPGA的千兆以太网设计(1)----大白话解释什么是以太网

孤独的单刀 3877

C/C++内存泄漏分析和解决方法

本文详细介绍了C/C++编程中的内存泄漏问题以及预防、解决办法。

贫道绝缘子的博客 4222

YOLOv11改进 | 注意力篇 | YOLOv11引入CA注意力机制

摘要:最近关于移动网络设计的研究已经证明了通道注意力(例如,挤压和激励注意力)对于提升模型性能的显着有效性,但它们通常忽略了位置信息,而位置信息对于生成空间选择性注意力图很重要。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~3.2 在Extramodule里创建CA。在CA.py文件里添加给出的CA代码。

tsg6698的博客 2981

Windbg调试c++内存泄漏

c++内存泄漏问题定位 内存泄漏指的是直接操作内存分配构造函数(例如new,malloc,HeapAlloc)来获得堆内存后,但是没有释放而导致的泄漏问题。我们的行情服务器是一个长期运行在客户服务器上的应用程序,如果存在内存泄漏,那么当内存增长到某个值时,会极大地影响当前机器的性能,直至影响我们的行情服务程序,甚至由于内存已不够而导致的程序崩溃。因此我们需要掌握内存泄漏问题的基本调试技...

无与伦比BLOG 1746

【人工智能】国产开源大模型聊天 AquilaChat 快速开始上手实战&效果评测

Aquila语言大模型在技术上继承了GPT-3、LLaMA等的架构设计优点,替换了一批更高效的底层算子实现、重新设计实现了中英双语的tokenizer,升级了BMTrain并行训练方法,在Aquila的训练过程中实现了比Magtron+DeepSpeed zero-2将近8倍的训练效率。Aquila语言大模型是在中英文高质量语料基础上从0开始训练的,通过数据质量的控制、多种训练的优化方法,实现在更小的数据集、更短的训练时间,获得比其它开源模型更优的性能。

AI天才研究院 2万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Linux环境C++多线程调试工具和内存泄漏工具介绍

幸运的是,Linux 提供了多种调试工具来帮助我们排查多线程相关的问题和内存泄漏。AddressSanitizer 是 GCC 和 Clang 编译器中的另一个强大的工具,用于检测内存错误,包括越界访问、堆栈溢出和内存泄漏。除了多线程问题,内存管理也是 C++ 程序中常见的挑战之一。执行该命令后,Valgrind 会跟踪程序的所有内存分配和释放情况,并在程序结束时给出详细的报告,指出泄漏的内存位置和大小。是一个用于跟踪程序执行时系统调用的工具,对于多线程程序,它可以帮助开发者检查线程相关的系统调用(例如。

ye_yumo的博客 1909

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

调试内存_c++内存泄漏调试心得

最近做项目的时候,在一个C++项目,增加了一个功能。测试发现内存泄漏严重,较长时间才解决。有了一点点心得。内存泄漏解决的办法:代码回退。新增的功能代码,完全绕过,测试有无问题。如果有问题,那就说明之前就有问题。如果没有问题,那就确定是新增代码有问题。在新增代码里,也是如此这般确定代码,即由大到小的绕过(注释),如果发现某个代码块有问题,在进入更小粒度的debug。尽情的free变量。相比内存泄漏,...

weixin_30863333的博客 325

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深入理解Linux调试工具eBPF和strace、内存泄漏处理、Kubernetes容器调试以及C++协程的崩溃信息收集

在软件开发领域,无论是初级开发者还是资深工程师,都需要面对复杂的调试工作。本文将介绍几个重要的调试工具和技术,并提供实际调试方法的指导,包括Linux环境下的eBPF和strace,内存泄漏问题的处理,Kubernetes容器环境下的调试技巧,以及C++20协程中的崩溃信息收集策略

hacker707的博客 1万+

C++调试 内存泄漏&内存越界 概述

大致介绍了一下内存泄漏和内存越界的情况,文中代码简单测试了一下各种可能出现的情况;内容不全

nzg_cat的博客 875

C++ 内存泄漏调试

C++和其他高级语言不同,需要自行管理内存,项目大\调用多,容易内存泄漏.内存申请释放使用malloc/free和new delete两种方式. 当内存报错弹出一个陌生的地址,我一脸懵逼,不清楚是哪个地方出的错,特别是程序退出的时候报错更不好定位.可以使用第三方工具来定位解决,也可以自己想办法解决. 我在做神经网络训练的时候碰到一个的BUG,发送完训练图片之后直接提示使用了非法内存. HEAP[Test.exe]: HEAP: Free Heap block 0000015E950E4A60 mod

北京菜刀 635

C++ & Linux 中 GDB 调试与内存泄漏检测详解

工具/功能GDB 调试Valgrindmtrace核心用途定位崩溃、逻辑错误全面内存检测(泄漏+错误)快速内存检测(泄漏+错误)简单内存泄漏检测编译要求需-g选项无(加-g更好)需需-g选项运行速度接近原程序慢(10-50倍)较快(2-5倍)接近原程序适用场景开发/调试阶段测试阶段开发/测试阶段简单程序/嵌入式环境最佳实践开发 C++ 程序时,编译时加,实时检测内存错误和泄漏。程序崩溃时,开启 core dump,用 GDB 分析core文件定位崩溃点。

XiaoBinbest的博客 1353

C++ 内存泄漏调试方式

联想到内存的申请释放方式,申请和释放总是配对的,申请的大小也是预先知道的.在内存申请申请释放的时候加上内存地址打印,当内存泄漏报错的时候就可以定位出错内存地址在哪个范围.我加入了一个内存打印函数,把内存地址范围和时间都打印出来.当内存报错弹出一个陌生的地址,我一脸懵逼,不清楚是哪个地方出的错,特别是程序退出的时候报错更不好定位.可以使用第三方工具来定位解决,也可以自己想办法解决.C++和其他高级语言不同,需要自行管理内存,项目大\调用多,容易内存泄漏.内存申请释放使用。从报错的意思看是重复释放内存.

2501_94114815的博客 20

QT/C++调试技巧:内存泄漏检测

内存泄漏:指的是在程序里动态申请的内存在使用完后,没有进行释放,导致这部分内存没有被系统回收,久而久之,可能导致程序内存不断增大,系统内存不足……引发一系列灾难性后果。

Rainbow 5540

C++高级调试技巧:内存泄漏检测与性能瓶颈分析

将其集成到Visual Studio项目中后,当程序运行结束时,它会自动检测并报告内存泄漏的详细信息,包括泄漏内存块的大小、分配位置等。例如,在每次new操作后记录内存地址,在对应的delete操作时将记录移除,程序结束时检查记录中是否还有未释放的内存地址。性能瓶颈指的是程序中执行效率较低、消耗大量资源的部分,它会导致程序整体运行缓慢,响应时间变长,严重影响用户体验。内存泄漏的成因多种多样,常见的有忘记调用delete释放new分配的内存、在异常处理中未释放已分配的资源、对象生命周期管理混乱等。

2501_91651722的博客 472

使用WinDug工具调试c#程序或c++程序的dmp崩溃文件,调试内存泄漏

1.调试c#程序内存泄漏步骤 设置symbol符号路径: SRV*c:\mysymbol*http://msdl.microsoft.com/download/symbols;d:/你的pdb文件路径 然后保存工作空间 加载dmp文件。 加载sos文件 .load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos ...

weixin_30791095的博客 638

javascript内存泄漏调试工具mac_c++内存泄漏调试心得

最近做项目的时候,在一个C++项目,增加了一个功能。测试发现内存泄漏严重,较长时间才解决。有了一点点心得。内存泄漏解决的办法:代码回退。新增的功能代码,完全绕过,测试有无问题。如果有问题,那就说明之前就有问题。如果没有问题,那就确定是新增代码有问题。在新增代码里,也是如此这般确定代码,即由大到小的绕过(注释),如果发现某个代码块有问题,在进入更小粒度的debug。尽情的free变量。相比内存泄漏,...

weixin_39524183的博客 164
上一篇: 不要再用if/else和switch/case了,快使用“表驱动法”代替,面向对象思维,对修改关闭。
下一篇: C++并发编程:线程安全链表
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值