为什么VS2015 MFC中的相同内存泄漏导致内存分配编号不断更改

Why does the memory allocation number keep changing for the same memory leak in VS2015 MFC?

本文关键字:内存 分配 编号 泄漏 MFC VS2015 为什么      更新时间:2023-10-16

我正在尝试使用VC++中的VS2015和MFC来消除应用程序中的内存泄漏。这个类似问题的答案也于事无补:当内存分配数为';不总是一样吗?

在"配置属性">"C/C++">"代码生成"中,我将为Runtime Library选择的选项从/MT更改为/MTd
该应用程序不是多线程的(afaik)。

内存分配数在程序运行之间发生变化,导致我在代码中处于不同的位置
我使用的程序以前运行得很好:
我从以前的内存泄漏报告中复制了一个内存分配编号,并启动了应用程序
当它在断点处停止时,我转到监视窗口,并将它粘贴到_crtBreakAlloc的值列中。(例如_crtBreakAlloc 1171)
然后在上运行程序,直到它中断,并使用调用堆栈定位未解冻的对象。

// Example of the memory report
...
{1171} client block at 0x088157A0, subtype c0, 224 bytes long.
f:ddvctoolsvc7libsshipatlmfcsrcmfcdumpcont.cpp(23) : atlTraceGeneral -     a ProgressBar object at $088157A0, 224 bytes long
{223} normal block at 0x01E79600, 324 bytes long.
Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
...
// Example of the next report
...
{1112} client block at 0x08B30480, subtype c0, 224 bytes long.
f:ddvctoolsvc7libsshipatlmfcsrcmfcdumpcont.cpp(23) : atlTraceGeneral - a ProgressBar object at $08B30480, 224 bytes long
{223} normal block at 0x01F693D8, 324 bytes long.
Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
...

请注意,内存分配编号"1171"更改为"1112",也会影响其上面的所有编号。
即使在仅打开VS2015的情况下启动电脑,并且在程序的相邻运行之间不执行任何操作,也会发生这种情况。我每次都保持程序的每次运行完全相同,以相同的顺序做相同的事情。例如,加载相同的文件,按下相同的按钮/键等。

要重新映射操作员新,代码具有-

//stdafx.h
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#else
#define DBG_NEW new
#endif
// CImage.h : main header file for the CImage application
#define _CRTDBG_MAP_ALLOC // Supports memory leakage detection.
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#endif
#endif

任何帮助都将不胜感激。谢谢

对此有很多答案。您显示的代码不够具体,无法告诉您更多信息。

  1. 您在init代码中生成其他线程吗?这将改变行为,因为执行的顺序没有保证
  2. 终止程序时,UI通常还会保存程序状态(MFC Next)。当您再次启动时,会再次加载此状态。不同的UI设置可能会导致此问题
  3. 不同的数据。即使将不同的命令行或任何其他不同的输入字符串打断为CString或std::string元素也可能导致移位。因为这取决于输入
  4. 即使在创建窗口时,某些消息处理也可能因程序的启动而有所不同,这取决于计时器和绘制消息的发生时间
  5. 我确信还有其他原因让我错过了。。。这个列表可能会增长

在您的情况下,当我看到分配编号时,这是一个非常早期的阶段。看看你的问题中报告的对象名称,我确信这与UI有关。

因此,清除程序的所有注册表项并确保输入数据确实相同可能会有所帮助。

即使这样,在早期阶段侵入代码也会有所帮助。(同上,分配款1100)。跨出来看看代码中发生了什么。在监视窗口中监视分配计数
有这么多的分配,所以我相信您可以通过几个步骤快速轻松地找到代码。