gpt4 book ai didi

c++ - 为什么VS2015 MFC中同样的内存泄漏,内存分配数一直在变化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:37 26 4
gpt4 key购买 nike

我正在尝试使用 VC++ 中的 VS2015 和 MFC 消除我的应用程序中的内存泄漏。这个类似问题的答案没有帮助:How to detect memory leak when memory allocation number isn't always same?

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

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

// Example of the memory report
...
{1171} client block at 0x088157A0, subtype c0, 224 bytes long.
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.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:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.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 的情况下启动 PC,并且在程序的相邻运行之间什么都不做,也会发生这种情况。我让程序的每次运行都完全相同,以相同的顺序做相同的事情。例如。加载相同的文件,按相同的按钮/按键等。

要重新映射 operator new,代码有-

//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. 您是否在初始化代码中生成了其他线程?这将改变行为,因为无法保证执行顺序。
  2. 当您终止程序时,您的 UI 通常也会保存它的状态 (MFC-Next)。当您再次开始时,此状态将再次加载。不同的 UI 设置可能会导致它。
  3. 不同的数据。即使将不同的命令行或任何其他不同的输入字符串分解为 CString 或 std::string 元素也可能导致移位。因为取决于输入。
  4. 即使在创建窗口时,一些消息处理也可能在程序启动时有所不同,这取决于计时器和绘制消息发生的时间。
  5. 我确信我错过了其他原因......这个列表可能会增加......

在您的情况下,当我看到分配编号时还处于非常早期的阶段。查看您问题中报告的对象名称,我确信它与 UI 有关。

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

即使它应该有所帮助,也可以在早期阶段闯入您的代码。 (即分配 1100)。跨步退出,看看您的代码中发生了什么。在监 window 口中观察分配计数。
有这么多的分配,所以我相信你可以通过几个步骤快速轻松地找到代码。

关于c++ - 为什么VS2015 MFC中同样的内存泄漏,内存分配数一直在变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47214000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com