检测到内存泄漏

Detected memory leaks

本文关键字:泄漏 内存 检测      更新时间:2023-10-16

在我的wxWidgets应用程序中,在调试模式下运行时,我在Visual Studio 2010的输出中得到了这个消息。应用程序运行正常,我只是在关闭它之后才看到这个。

检测到内存泄漏!

转储对象->

{9554}正常块位于0x003CDCC0,长44字节。
数据:& lt;e n d> 20 C1 65 01 01 00 00 00 6E 00 00 00 9C CE 64 01

{9553}正常块在0x003CDB58, 8字节长。

数据:& lt;D & e;> 44 bd65 01 C0 DC 3C 00
{9552}正常块在0x003CDC50, 48字节长。

数据:& lt;e> A0 95 65 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

对象转储完成。

在我的程序中,我没有显式分配内存,但是wxWidgets框架是。我第一次收到这样的消息,不知道确切的原因。

我怎样才能摆脱这个内存泄漏?

您只需要在main函数的开头添加以下几行代码。添加此标志后,Visual Studio将在产生内存泄漏的行中断。

    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    _CrtSetBreakAlloc(9554);
    _CrtSetBreakAlloc(9553);
    _CrtSetBreakAlloc(9552);

确保你有正确的对象正常块地址,因为它们可能会改变,并确保你在_DEBUG上编译。

请参见:_CrtSetDbgFlag和_CrtSetBreakAlloc。

  1. 永远不要"假设"你的代码是内存防泄漏的。除非您是编程高手之一,否则没有人可以避免可能的编写内存泄漏。

  2. 你可以使用像bounds checker (From Microfocus)这样的工具来帮助识别内存泄漏,因为它会给你一个调用堆栈。从调试CRT获得的内存泄漏报告只是告诉您在特定地址发生了内存泄漏。像边界检查器这样的产品将为内存泄漏提供调用堆栈,以及许多其他好东西。市场上还有其他内存泄漏工具,但我不会在这里列出它们。

  3. 如果你确定内存泄漏是由于'wxWidgets',那么也许你应该通知该库的作者,也许他们会修复它(与合适的复制步骤)。

也许某些类型的静态实例仍然由框架分配。尝试使用像"devpartner"这样的分析器来解决这个问题。

本wiki建议将以下内容添加到您拥有的每个源文件中,在所有其他头文件包含之后:

#ifdef __WXMSW__
    #include <wx/msw/msvcrt.h>      // redefines the new() operator 
#endif

这将导致程序结束时报告泄漏。

更具体地说,确保在使用new创建的所有对象上调用->Destroy()(可能除了您的顶部窗口)。

如果vs报告的泄漏位置每次都是相同的,您可以设置一个数据断点来查看此内存何时被更改,并希望找出谁在分配此内存