检测到内存泄漏

问题描述 投票:11回答:5

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

检测到内存泄漏!

转储对象 - >

{9554}正常块位于0x003CDCC0,44个字节长。 数据:<e n d> 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个字节。

日期:<和> A0 95 65 01 01 00 00 00 19 00 00 00 19 00 00 00

对象转储完成。

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

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

c++ visual-studio-2010 memory-leaks wxwidgets
5个回答
33
投票

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

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

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

另见:_CrtSetDbgFlag_CrtSetBreakAlloc


0
投票
  1. 永远不要“假设”您的代码是内存泄漏证明。除非你是编程的半神之一,否则没有人可以免于编写内存泄漏。
  2. 你可以使用像边界检查器(From Microfocus)这样的工具来帮助识别内存泄漏,因为它会给你一个callstack。您从调试CRT获得的内存泄漏报告只是告诉您泄漏到特定地址的内存。像bounds checker这样的产品会给你一个内存泄漏的callstack,还有很多其他好东西。市场上还有其他内存泄漏工具,但我不会在这里列出它们。
  3. 如果您确定内存泄漏是由'wxWidgets'引起的,那么也许您应该通知该库的编写者,也许他们会修复它(使用合适的repro步骤)。

0
投票

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


0
投票

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

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.