我试图在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
非常感谢任何帮助。谢谢
答案 0 :(得分:1)
这有很多答案。您显示的代码不够具体,无法告诉您更多信息。
在您的情况下,当我看到分配编号时,这是一个非常早期的阶段。并且查看问题中报告的对象名称,我确信它与UI有关。
因此清除程序的所有注册表项可能会有所帮助,并确保输入数据真的相同。
即使它应该有帮助,在早期阶段闯入您的代码。 (即在分配1100处)。一步一步地看看代码中会发生什么。在监视窗口中观察分配计数。
分配的次数很多,所以我确信只需几步即可快速轻松地找到代码。