关于mfc内存泄漏的问题,如何解决?

一个较为复杂的制图打印图片软件,然而出现了奇怪的内存泄漏,使用内存快照均为未解析的分配,名称均为各种动态链接库,请问各位师傅有啥头绪,我主业android,有时才支援c++一些小的修改,但以前内存泄漏快照一下也基本出来了,这次的复杂度比较高

img


img

img

img

并且随着时间,有一部分会被逐渐释放,但很慢。
但一段时间后又不会变了

img

如何调试MFC中的内存泄漏 转载

可以借鉴下
https://blog.51cto.com/u_15456319/4805857

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

MFC程序中常见的内存泄漏有以下几种情况:

  1. 对象创建后未删除。如创建了CObject类型的对象但未调用delete释放。
  2. circular references。两个或多个对象相互引用,导致其中一个对象未被正确释放。
  3. 全局变量或静态变量引用了动态对象但未释放。
  4. 事件(event)注册但未注销。如注册了一个定时器但未调用KillTimer注销,会导致定时器对象未释放。
  5. 打开文件、数据库连接等但未关闭。这会导致相关资源未释放。

解决MFC内存泄漏的方法:

  1. 确保每一个new创建的对象都有对应的delete进行释放。尤其注意在函数退出时是否 missed 了delete。
  2. 避免循环引用。如两个对象相互引用,应该用weak reference的方式,其中一个对象使用指针引用另一个对象。
  3. 确保全局变量或静态变量不引用动态对象。如果引用,在程序退出前释放。
  4. 注册的事件或资源要在不需要时注销。如KillTimer、Disconnect等。
  5. 打开的文件、网络连接等在使用结束后关闭。
  6. 使用调试工具检测内存泄漏。如Visual Leak Detector,Debug版本的CRT等。
  7. 避免长时间运行的程序。可以适当地重启程序释放资源。
  8. 使用智能指针如std::shared_ptr管理动态对象。
  9. 避免使用大量静态对象,应优先使用动态对象。静态对象无法释放内存。

以上方法可以较好地解决MFC程序中的内存泄漏问题。通过良好的编码习惯,使用内存调试工具,采取必要措施避免或释放内存泄漏,可以写出健壮的MFC程序。

如果您有任何关于MFC内存泄漏的其他问题,也请在CSDN中提出,我会及时进行解答和解释。谢谢!

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
MFC 内存泄漏问题一般需要通过以下步骤来解决:

1、 确认是否存在内存泄漏

首先,需要确认是否确实存在内存泄漏。可以使用 Visual Studio 自带的内存泄漏检测工具(Memory Leak Detection)来检测程序的内存使用情况。在程序运行结束后,检查输出窗口中是否有内存泄漏的信息。

2、 找到内存泄漏的原因

如果确实存在内存泄漏,需要使用调试工具来找到内存泄漏的原因。可以使用 Visual Studio 自带的调试工具,例如调试器(Debugger)、性能分析器(Profiler)等。

在调试过程中,可以使用断点(Breakpoint)来定位问题,查看变量的值、函数的调用栈等信息,以找到内存泄漏的原因。通常情况下,内存泄漏的原因可能是以下几个方面:

  • 对象没有正确地被销毁
  • 对象被重复创建而没有被销毁
  • 对象被存储在容器中,但容器没有正确地管理对象的生命周期
  • 对象被存储在堆中,但没有正确地释放内存

3、 解决内存泄漏问题

根据内存泄漏的原因,可以采取不同的解决方法。例如:

  • 确保每个对象都被正确地销毁
  • 避免重复创建对象
  • 确保容器正确地管理对象的生命周期
  • 在堆上分配内存后,及时释放内存

此外,还可以采用一些工具和技术来辅助解决内存泄漏问题,例如:

  • 使用智能指针(Smart Pointer)来管理对象的生命周期
  • 使用内存池(Memory Pool)来管理内存的分配和释放
  • 使用代码分析工具(Code Analysis)来检测代码中的潜在问题

总之,解决 MFC 内存泄漏问题需要对程序有较为深入的了解和掌握相关的调试工具和技术,建议多参考相关文献和资料,结合实际情况进行问题分析和解决。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/739121
  • 除此之外, 这篇博客: MFC之单选框,复选框用法案例中的 单选框,复选框为常见的功能按键,其使用频率也不低,并且用法非常简单,下面以一个案例介绍一下单选框和复选框的使用。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1.新建一个MFC对话框工程,按如下布局添加相关按钮。
    在这里插入图片描述

    2.1. 三个单选框默认ID为IDC_RADIO1,IDC_RADIO2和IDC_RADIO3,不更改,使用默认。
    2.2. 为四个复选框关联4个控件类型变量,具体类型为CButton,变量名称分别为m_CheckLike1,m_CheckLike2,m_CheckLike3,m_CheckLike4,如图:
    在这里插入图片描述
    3.为单选框设置默认被选中状态 :
    在OnInitDialog()函数 // TODO: Add extra initialization here下面添加一行代码:

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
MFC内存泄漏是一个比较常见的问题,尤其是在长时间运行的程序中。在你所描述的情况下,建议你使用内存泄漏检测工具,如Visual Leak Detector或Intel Parallel Inspector进行分析。这些工具可以帮助你找出哪些对象没有被释放,从而找到内存泄漏的原因。

另外,也可以通过代码分析寻找内存泄漏的原因。下面是一些可能导致内存泄漏的情况:

1.创建对象但未释放。在MFC中,你可以使用CObject或其他类来管理对象的创建和释放,确保所有对象都被正确释放。

2.在循环中分配内存但未释放。如果你在循环中分配了内存,但在循环结束后没有释放,则可能导致内存泄漏。

3.使用MFC中的一些函数导致内存泄漏。例如,当你使用CString::Format()函数时,会返回一个CString对象。如果你在使用完后不及时释放该对象,则会导致内存泄漏。

4.使用不当的窗口处理函数。如果你使用了MFC中的窗口处理函数(如OnPaint()),但在函数中没有正确释放资源,则可能导致内存泄漏。

在找到内存泄漏的原因后,修复问题的方法取决于具体的情况。你可以尝试在代码中添加释放内存的语句,或者使用智能指针等技术来自动管理对象的生命周期。以下是一些可能有用的代码示例:

CObject* pObject = new CObject(); // 创建对象
...
delete pObject; // 释放对象

CString strText;
strText.Format(_T("Text: %d"), nValue); // 创建CString对象
...
strText.Empty(); // 释放CString对象

// 使用智能指针自动管理对象生命周期
std::shared_ptr spObject(new CObject());
...

希望这些信息可以帮助你解决内存泄漏的问题。记得如果你需要更具体的帮助,请在评论区留言。
如果我的回答解决了您的问题,请采纳!