为什么VS2015 MFC中的相同内存泄漏导致内存分配编号不断更改
Why does the memory allocation number keep changing for the same memory leak in VS2015 MFC?
我正在尝试使用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
任何帮助都将不胜感激。谢谢
对此有很多答案。您显示的代码不够具体,无法告诉您更多信息。
- 您在init代码中生成其他线程吗?这将改变行为,因为执行的顺序没有保证
- 终止程序时,UI通常还会保存程序状态(MFC Next)。当您再次启动时,会再次加载此状态。不同的UI设置可能会导致此问题
- 不同的数据。即使将不同的命令行或任何其他不同的输入字符串打断为CString或std::string元素也可能导致移位。因为这取决于输入
- 即使在创建窗口时,某些消息处理也可能因程序的启动而有所不同,这取决于计时器和绘制消息的发生时间
- 我确信还有其他原因让我错过了。。。这个列表可能会增长
在您的情况下,当我看到分配编号时,这是一个非常早期的阶段。看看你的问题中报告的对象名称,我确信这与UI有关。
因此,清除程序的所有注册表项并确保输入数据确实相同可能会有所帮助。
即使这样,在早期阶段侵入代码也会有所帮助。(同上,分配款1100)。跨出来看看代码中发生了什么。在监视窗口中监视分配计数
有这么多的分配,所以我相信您可以通过几个步骤快速轻松地找到代码。
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配