为什么VS2015 MFC中的内存分配数量会因同一内存泄漏而不断变化?

时间:2017-11-10 00:42:06

标签: c++ visual-c++ memory-leaks mfc

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

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

内存分配编号在程序运行之间发生变化,导致我在代码中的不同位置 我以前使用的程序工作得很好:
我从先前的内存泄漏报告中复制内存分配编号,然后启动应用程序 当它在断点处停止时,我转到监视窗口,并将其粘贴到_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 
 ...

请注意内存分配编号&#34; 1171&#34;更改为&#34; 1112&#34;,也会影响其上方的所有数字。
即使在仅打开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 个答案:

答案 0 :(得分:1)

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

  1. 您是否在init代码中生成其他线程?这将改变行为,因为无法保证执行顺序。
  2. 当您终止程序时,您通常也会将其保存为状态(MFC-Next)。当你重新开始时,会再次加载此状态。不同的UI设置可能会导致它。
  3. 不同的数据。即使将不同的命令行或任何其他不同的输入字符串分成CString或std :: string元素,也可能导致移位。因为取决于输入。
  4. 即使在创建窗口时,某些消息处理可能因程序的开始和开始而不同,具体取决于计时器和绘制消息的发生时间。
  5. 我确信我错过了其他原因......这个名单可能会增长......
  6. 在您的情况下,当我看到分配编号时,这是一个非常早期的阶段。并且查看问题中报告的对象名称,我确信它与UI有关。

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

    即使它应该有帮助,在早期阶段闯入您的代码。 (即在分配1100处)。一步一步地看看代码中会发生什么。在监视窗口中观察分配计数。
    分配的次数很多,所以我确信只需几步即可快速轻松地找到代码。