检测到内存泄漏

时间:2011-12-17 10:25:29

标签: c++ visual-studio-2010 memory-leaks wxwidgets

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

  

检测到内存泄漏!

     

转储对象 - >

     

{9554}正常阻塞位于0x003CDCC0,44个字节长   数据:<并且> 20 C1 65 01 01 00 00 00 6E 00 00 00 9C CE 64 01

     

{9553}正常块,位于0x003CDB58,长度为8个字节。

     

数据:< D e< > 44 BD 65 01 C0 DC 3C 00
  {9552}正常阻塞位于0x003CDC50,长度为48个字节。

     

数据:< e> A0 95 65 01 01 00 00 00 19 00 00 00 19 00 00 00

     

对象转储完成。

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

我如何摆脱这种内存泄漏?

5 个答案:

答案 0 :(得分:33)

您只需在主函数的开头添加以下行。添加此标志后,Visual Studio将在创建内存泄漏的行中断。

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

确保您拥有正确的对象普通块地址,因为它们可能会更改并确保您在_DEBUG上进行编译。

另请参阅:_CrtSetDbgFlag_CrtSetBreakAlloc

答案 1 :(得分:0)

框架仍然可以分配某些静态实例。尝试使用像“devpartner”这样的探查器来解决它。

答案 2 :(得分:0)

  1. 永远不要“假设”您的代码是内存泄漏证明。除非你是编程的半神之一,否则没有人可以免于编写内存泄漏。

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

  3. 如果您确定内存泄漏是由'wxWidgets'引起的,那么也许您应该通知该库的编写者,也许他们会修复它(使用合适的重复步骤)。

答案 3 :(得分:0)

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

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

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

更具体地说,请务必使用->Destroy()为您创建的所有对象调用new(顶窗除外)。

答案 4 :(得分:0)

如果vs报告的泄漏位置每次都设置一个databreakpoint以查看何时更改此内存并希望找出谁正在分配此内存