返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++内存泄漏调试方式是什么
  • 426
分享到

C++内存泄漏调试方式是什么

2023-06-30 11:06:32 426人浏览 安东尼
摘要

这篇文章主要介绍“c++内存泄漏调试方式是什么”,在日常操作中,相信很多人在C++内存泄漏调试方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++内存泄漏调试方式是什么”的疑惑有所帮助!接下来,请跟

这篇文章主要介绍“c++内存泄漏调试方式是什么”,在日常操作中,相信很多人在C++内存泄漏调试方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++内存泄漏调试方式是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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 StartMainDlg::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 freedTest.exe 已触发了一个断点。
  • 第一次申请 [0000015E95077CD0:0000015E950780D0]  释放失败

  • 第二次申请[0000015E951577D0:0000015E95157BD0]   释放成功

  • 第三次申请[0000015E950E4AA0:0000015E950E4EA0]  释放成功

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

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

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

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

到此,关于“C++内存泄漏调试方式是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

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

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

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

猜你喜欢
  • C++内存泄漏调试方式是什么
    这篇文章主要介绍“C++内存泄漏调试方式是什么”,在日常操作中,相信很多人在C++内存泄漏调试方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++内存泄漏调试方式是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-30
  • C++ 内存泄漏调试方式
    C++和其他高级语言不同,需要自行管理内存,项目大\调用多,容易内存泄漏.内存申请释放使用malloc/free和new delete两种方式. 当内存报错弹出一个陌生的地址,我一脸...
    99+
    2024-04-02
  • C++ 中内存泄漏的调试技巧
    c++++ 中内存泄漏调试技巧包括:使用调试器(visual studio 或 gdb)设置断点和检查变量。使用 valgrind 等内存调试器分析内存使用情况并检测泄漏。手动管理内存分...
    99+
    2024-05-04
    c++ 内存泄漏 linux
  • c语言内存泄漏的解决方法是什么
    在C语言中,内存泄漏是指在动态内存分配后,没有释放该内存导致内存空间无法被再次使用的情况。解决内存泄漏的方法可以包括以下几个方面:1...
    99+
    2023-09-27
    c语言
  • 如何调试 PHP 函数中内存泄漏?
    调试 php 函数中的内存泄漏至关重要,可使用 xdebug、phpunit 或 valgrind 等工具。具体步骤如下:1. 使用 xdebug 添加跟踪函数并生成包含泄漏信息的 .x...
    99+
    2024-04-17
    内存泄漏 php函数
  • JavaScript内存泄漏和内存溢出是什么
    本篇内容主要讲解“JavaScript内存泄漏和内存溢出是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript内存泄漏和内存溢出是什么”吧! ...
    99+
    2024-04-02
  • C++技术中的内存管理:内存泄漏检测和调试技巧
    检测内存泄漏使用 valgrind 等工具检测内存泄漏。利用 ms visual studio memory profiler 识别泄漏。借助 c++++ runtime library...
    99+
    2024-05-08
    内存管理 调试技巧 c++ 标准库
  • java中内存泄漏和内存溢出是什么
    内存泄漏(Memory Leak)是指在程序运行过程中,因为不正确的内存管理而导致一部分内存无法被回收的现象。当程序中的对象不再被使...
    99+
    2023-08-25
    java
  • JavaScript中内存泄漏指的是什么
    内存泄漏是指程序中一个对象被分配到内存中既不能使用,又不能回收,留在了堆内存中就称为内存泄漏,当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,...
    99+
    2024-04-02
  • golang内存泄漏的原因是什么
    这篇“golang内存泄漏的原因是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“golang内存泄漏的原因是什么”文章吧...
    99+
    2023-07-04
  • android内存泄漏的方式有哪些
    Android内存泄漏的方式有以下几种: 非静态内部类的引用:当非静态内部类被声明为静态,它的生命周期将和外部类相同,从而避免了...
    99+
    2023-10-23
    android
  • java内存泄漏和内存溢出的原因是什么
    Java内存泄漏和内存溢出的原因如下:1. 内存泄漏:内存泄漏指的是在程序运行过程中,无用的对象仍然被保持在内存中,导致内存占用不断...
    99+
    2023-08-26
    java
  • 什么是Java的永久代(PermGen)内存泄漏
    Java的永久代(PermGen)是Java虚拟机(JVM)内存模型的一部分,用于存储类的元数据,例如类的名称、方法、字段等。永久代...
    99+
    2023-09-14
    Java
  • golang内存泄漏的原因及解决方法是什么
    Golang中的内存泄漏是指程序中分配的内存没有被适时地释放,导致程序占用的内存逐渐增加,最终耗尽系统内存资源。内存泄漏的原因和解决...
    99+
    2023-10-20
    golang
  • android内存泄漏的原因及解决方法是什么
    Android内存泄漏的原因可能有以下几个:1. 长生命周期的对象持有短生命周期的引用:当一个长生命周期的对象持有了一个短生命周期对...
    99+
    2023-08-08
    android
  • C++技术中的内存管理:有效避免内存泄漏的解决方案是什么?
    c++++ 内存管理常见陷阱:内存泄漏,会导致应用程序崩溃。避免内存泄漏的解决方案:使用智能指针自动管理内存。运用 raii 资源管理技术确保对象超出作用域后释放资源。正确使用 new ...
    99+
    2024-05-07
    内存泄漏 内存管理 c++ 作用域
  • C/C++程序调试和内存检测的方法是什么
    本篇内容主要讲解“C/C++程序调试和内存检测的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C/C++程序调试和内存检测的方法是什么”吧!1、常用的调试技巧(1)代码检查,重新阅读程...
    99+
    2023-06-05
  • android内存泄漏的解决方式有哪些
    解决Android内存泄漏的方式有以下几种:1. 避免使用静态变量:静态变量的生命周期与应用程序的生命周期相同,如果不及时释放,会导...
    99+
    2023-09-09
    android
  • JavaScript中出现内存泄漏的原因是什么
    本篇文章给大家分享的是有关JavaScript中出现内存泄漏的原因是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。泄露方式在接下来的内容中...
    99+
    2024-04-02
  • android内存溢出和内存泄漏有什么区别
    Android内存溢出和内存泄漏是两个不同的问题。1. 内存溢出(Memory Overflow):内存溢出指的是当应用程序分配的内...
    99+
    2023-08-08
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作