2011-12-17 107 views
9

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

检测到内存泄漏!

倾倒对象 - >

{9554}在0x003CDCC0正常块,44个字节长。
数据:<简d> 20 C1 65 01 01 00 00 00 6E 00 00 00 9C 64 CE 01

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

数据:< dé<> 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框架是。我第一次得到这样的信息,并不知道它的确切原因。

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

+1

发布您的代码,最好是最小的程序这再现了这个问题。 – user1071136 2011-12-17 11:14:27

+0

不幸的是我不能发布一个最小的程序。因为它是一个包含多个文件的GUI程序,还有一个GUI框架。我不知道是什么导致了这一点。因为我没有使用`new`或`malloc`。 – 2011-12-17 11:22:16

+0

我只是怕你会得到更多的猜测比答案:) – user1071136 2011-12-17 11:56:10

回答

24

您只需在主函数的开头添加以下行。添加这个标志,Visual Studio将会破坏创建内存泄漏的那一行。

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

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

另请参阅:_CrtSetDbgFlag_CrtSetBreakAlloc MSDN参考。

0

也许某些静态实例仍然由框架分配。试着用像“devpartner”这样的profiler解决它。

+0

可以从视觉工作室的消息用于获得一些帮助? – 2011-12-17 11:10:49

0
  1. 不要只是'假设'你的代码是内存泄漏证明。除非你是编程的半神之一,否则没有人可以避免写内存泄漏。

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

  3. 如果你确定内存泄漏是由于'wxWidgets'造成的,那么也许你应该通知该库的编写者,他们可能会修复它(通过适当的repro步骤)。

0

This wiki建议增加以下内容你有充分的源文件,毕竟其他头包括的:

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

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

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

0

如果用vs报告泄漏的位置是相同的每一个你可以设置一个databreakpoint看到时候该存储器正在改变,希望找出是谁分配此内存