iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ 内存泄漏调试方式
  • 598
分享到

C++ 内存泄漏调试方式

2024-04-02 19:04:59 598人浏览 薄情痞子
摘要

c++和其他高级语言不同,需要自行管理内存,项目大\调用多,容易内存泄漏.内存申请释放使用malloc/free和new delete两种方式. 当内存报错弹出一个陌生的地址,我一脸

c++和其他高级语言不同,需要自行管理内存,项目大\调用多,容易内存泄漏.内存申请释放使用malloc/freenew delete两种方式.

当内存报错弹出一个陌生的地址,我一脸懵逼,不清楚是哪个地方出的错,特别是程序退出的时候报错更不好定位.可以使用第三方工具来定位解决,也可以自己想办法解决.

我在做神经网络训练的时候碰到一个的BUG,发送完训练图片之后直接提示使用了非法内存.

HEAP[Test.exe]: HEAP: Free Heap block 0000015E950E4A60 modified at 0000015E950E4AA0 after it was freed.

代码迭代了多次,部分功能没有测试,也不清楚哪里出的问题.

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

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

在程序中申请\释放部分加入DebugHeap

static Neural * mThis;
static FileInfo mFileInfo;
Neural *Neural:: GetInstance(MainDlg * parent,DlGCommand * cmd)
{
    if (mThis == NULL)
    {
        mThis = new Neural(parent);
        mCmd = cmd;
    }
    return mThis;
}
 
void Neural:: ReleaseInstance()
{
    if (mThis != NULL)
        delete mThis;
}
 
Neural::Neural(MainDlg * parent)
{
    mFileInfo.mRcv = (unsigned char *)malloc(1024);
    DebugHeap("flag1:alloc", mFileInfo.mRcv, 1024);
}
 
Neural::~Neural(void)
{
    bWork = FALSE;
    DebugHeap("flag1:free ", mFileInfo.mRcv, 1024);
    free(mFileInfo.mRcv);
}

程序运行中的日志:

==>  ThreadRecvProc Start
==>  ThreadInterrupt Start
MainDlg::OnInitDialog()
========>heap name:flag1:alloc,address [0000015E95077CD0:0000015E950780D0],time:7870921 (ms)
“Test.exe”(Win32): 已加载“C:\windows\System32\clbcatq.dll”。无法查找或打开 PDB 文件。
“Test.exe”(Win32): 已加载“C:\Windows\System32\edputil.dll”。无法查找或打开 PDB 文件。
....
线程 0x2a10 已退出,返回值为 0 (0x0)。
线程 0x2ae4 已退出,返回值为 0 (0x0)。
“Test.exe”(Win32): 已加载“C:\Windows\System32\mswsock.dll”。无法查找或打开 PDB 文件。
连接服务器成功!
线程 0x16c8 已退出,返回值为 96 (0x60)。
线程 0xa0c 已退出,返回值为 0 (0x0)。
“Test.exe”(Win32): 已加载“C:\Windows\System32\msctfuimanager.dll”。无法查找或打开 PDB 文件。
....
========>heap name:flag1:alloc,address [0000015E951577D0:0000015E95157BD0],time:7885500 (ms)
Ending:43707
========>heap name:flag1:free ,address [0000015E951577D0:0000015E95157BD0],time:7885609 (ms)
线程 0x2f20 已退出,返回值为 0 (0x0)。
========>heap name:flag1:alloc,address [0000015E950E4AA0:0000015E950E4EA0],time:7887265 (ms)
analyse:3, D:\数据\FSSD\V5\target.csv
========>heap name:flag1:free ,address [0000015E950E4AA0:0000015E950E4EA0],time:7887296 (ms)
线程 0x2a00 已退出,返回值为 0 (0x0)。
线程 0xe84 已退出,返回值为 0 (0x0)。
HEAP[Test.exe]: HEAP: Free Heap block 0000015E950E4A60 modified at 0000015E950E4AA0 after it was freed
Test.exe 已触发了一个断点。
  • 第一次申请 [0000015E95077CD0:0000015E950780D0]  释放失败
  • 第二次申请[0000015E951577D0:0000015E95157BD0]   释放成功
  • 第三次申请[0000015E950E4AA0:0000015E950E4EA0]  释放成功

从报错的意思看是重复释放内存.0000015E950E4AA0 地址被重复释放,这个地址刚好是第三次申请的地址.

看现象是第一次申请的地址被改动了,查看这部分代码分析原因.

按照我预想在构造函数申请内存,析构函数释放内存,是能配对.代码里加入单例模式并且使用了一个全局变量mFileInfo,随着构造函数调用会不断改变.我预想是这个类只能单例使用,由于历史原因,部分代码并没有使用单例模式.单例中的申请的地址位置被改动了,所以没办法正确释放.统一使用单例模式,这个问题解决了.

C++出现内存错误时候,把申请/释放的地址打印出来能更快更准确的定位到问题.

到此这篇关于C++ 内存泄漏调试方式的文章就介绍到这了,更多相关C++ 内存泄漏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ 内存泄漏调试方式

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

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

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

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

下载Word文档
猜你喜欢
  • C++ 内存泄漏调试方式
    C++和其他高级语言不同,需要自行管理内存,项目大\调用多,容易内存泄漏.内存申请释放使用malloc/free和new delete两种方式. 当内存报错弹出一个陌生的地址,我一脸...
    99+
    2024-04-02
  • C++内存泄漏调试方式是什么
    这篇文章主要介绍“C++内存泄漏调试方式是什么”,在日常操作中,相信很多人在C++内存泄漏调试方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++内存泄漏调试方式是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-30
  • C++ 中内存泄漏的调试技巧
    c++++ 中内存泄漏调试技巧包括:使用调试器(visual studio 或 gdb)设置断点和检查变量。使用 valgrind 等内存调试器分析内存使用情况并检测泄漏。手动管理内存分...
    99+
    2024-05-04
    c++ 内存泄漏 linux
  • 如何调试 PHP 函数中内存泄漏?
    调试 php 函数中的内存泄漏至关重要,可使用 xdebug、phpunit 或 valgrind 等工具。具体步骤如下:1. 使用 xdebug 添加跟踪函数并生成包含泄漏信息的 .x...
    99+
    2024-04-17
    内存泄漏 php函数
  • C++技术中的内存管理:内存泄漏检测和调试技巧
    检测内存泄漏使用 valgrind 等工具检测内存泄漏。利用 ms visual studio memory profiler 识别泄漏。借助 c++++ runtime library...
    99+
    2024-05-08
    内存管理 调试技巧 c++ 标准库
  • android内存泄漏的方式有哪些
    Android内存泄漏的方式有以下几种: 非静态内部类的引用:当非静态内部类被声明为静态,它的生命周期将和外部类相同,从而避免了...
    99+
    2023-10-23
    android
  • C++之内存泄漏排查详解
    目录一 、经验排查二 、使用Visual Leak Detector for Visual C++2.1 Visual Leak Detector for Visual C++简介2...
    99+
    2024-04-02
  • PHP 内存泄漏检测:识别和解决内存泄漏
    答案:php 内存泄漏是循环引用引起的,导致应用程序占用内存越来越多。步骤:检测内存泄漏:使用 debug_backtrace()、xdebug 或 php-gc 等工具。实战案例:循环...
    99+
    2024-05-11
    php 内存泄漏 垃圾回收器
  • android内存泄漏的解决方式有哪些
    解决Android内存泄漏的方式有以下几种:1. 避免使用静态变量:静态变量的生命周期与应用程序的生命周期相同,如果不及时释放,会导...
    99+
    2023-09-09
    android
  • C/C++实现内存泄漏检测详解
    目录内存泄漏的两个问题使用宏定义覆盖 malloc 和 free 函数使用 hook 钩子内存泄漏的两个问题 是否有内存泄漏?内存泄漏是在代码的哪一行? 检测内存泄漏主要从上面两个问...
    99+
    2023-02-09
    C++内存泄漏检测 C++内存泄漏
  • Perfdog玩转内存泄漏
    背景交代最近QC同学在跑游戏的过程中发现玩的时间久了游戏会发生闪退,经过搜集信息后排除了功能性bug的一.判断是否是内存泄露拿到真机,USB连接,杀掉多余后台进程,打开Perfdog,接下来一顿操作猛如虎,Perfdog具体操作不在赘述,有...
    99+
    2023-06-05
  • 浅谈QT内存泄漏
    目录01前言02 QT半自动化内存管理要点03实验过程详解Malloc分配的内存空间实践实例04总结01前言    前几天,项目开展了一次代码初次评审。会上,领导...
    99+
    2024-04-02
  • C++内存泄漏问题分析与解决方案
    C++内存泄漏问题分析与解决方案在C++的开发过程中,内存泄漏是一个常见的问题。当程序动态分配内存后却没有正确释放,在程序运行过程中会导致内存的不断累积,最终耗尽系统的可用内存。内存泄漏不仅会影响程序的性能,还可能导致程序崩溃甚至系统崩溃。...
    99+
    2023-10-22
    C++ 解决方案 内存泄漏
  • C++ 中使用 RAII 避免内存泄漏
    C++ 中使用 RAII 避免内存泄漏 什么是 RAII? RAII(资源获取即初始化)是一种 C++ 编程范例,用于确保在对象超出范围或销毁时自动释放资源。 为什么使用 RAII? ...
    99+
    2024-04-30
    c++ raii 标准库
  • 使用上下文装饰器调试Pytorch的内存泄漏问题
    装饰器是 python 上下文管理器的特定实现。本片文章将通过一个pytorch GPU 调试的示例来说明如何使用它们。虽然它可能不适用于所有情况,但我它们却是非常有用。调试内存泄漏问题有很多方法可以调试内存泄漏。本文将展示一种识别代码中...
    99+
    2023-05-14
    Python 装饰器 内存泄漏
  • Java 中的内存泄漏
    什么是 Java 中的内存泄漏? 当应用程序持有不再需要的对象引用时,就会发生 Java 内存泄漏。这些意外的对象引用阻止内置的 Java 垃圾收集机制释放这些对象消耗的内存,最终导致致命的OutOfMemoryError。 简而言之,...
    99+
    2023-10-11
    java jvm 开发语言
  • 【转】Java的内存泄漏
    一 问题的提出Java的一个重要优点就是通过垃圾收集器 (Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的...
    99+
    2023-06-03
  • c语言内存泄漏的解决方法是什么
    在C语言中,内存泄漏是指在动态内存分配后,没有释放该内存导致内存空间无法被再次使用的情况。解决内存泄漏的方法可以包括以下几个方面:1...
    99+
    2023-09-27
    c语言
  • C#开发中如何避免内存泄漏
    C#开发中如何避免内存泄漏,需要具体代码示例内存泄漏是软件开发过程中常见的问题之一,特别是在使用C#语言进行开发时。内存泄漏会导致应用程序占用越来越多的内存空间,最终导致程序运行缓慢甚至崩溃。为了避免内存泄漏,我们需要注意一些常见的问题并采...
    99+
    2023-10-22
    垃圾回收 内存管理 资源释放
  • C++ 内存管理:避免内存泄漏的最佳实践
    内存泄漏是 c++++ 中常见的错误,可通过最佳实践来避免:使用智能指针自动管理内存,避免悬空指针。遵循 raii 原则,确保资源在不再需要时释放。编写自定义析构函数来显式释放资源。定期...
    99+
    2024-05-03
    c++ 内存管理 作用域
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作