过滤_CrtDumpMemoryLeaks转储的内存泄漏

时间:2010-07-16 19:20:03

标签: c++ memory-leaks

我试图在我的程序中找到泄漏,这是一个基于Ogre3D的框架。我在我的代码中使用以下定义来“新”任何东西,以便稍后可以通过程序检测并正确报告任何泄漏。

#ifdef _DEBUG
#include <crtdbg.h>
    #define MyFW_NEW new(_NORMAL_BLOCK ,__FILE__, __LINE__)
    #define MyFW_DELETE delete
#else
    #define MyFW_NEW new
    #define MyFW_DELETE delete
#endif

这很好用,并且只要我使用 MyFW_NEW '我'新',就会提醒我任何泄漏(如果有人想知道为什么我也有删除定义,那只是为了完整性当我删除使用MyFW_NEW新建的内容时,我想用MyFW_DELETE删除它。

问题是它正在检测Ogre中的泄漏(无论它们是否在那里,或者它是否检测到错误泄漏不是这里的问题)并且输出了大量泄漏到我指定的文件中并且它们是如此之多(主要是重复一遍,Visual Studio挂了10分钟,这是不可接受的。我的框架泄漏来自我的框架依赖的库中的大约一百个泄漏。而且,它没有给我行号或负责泄漏的文件。我肯定知道泄漏不是源于我的框架,因为我已经尝试注释掉除了一些导致这些泄漏的Ogre的核心功能之外的一切(下面给出的输出)。

如果我假设这些都是虚假泄漏(即使它们是真正的泄漏,我必须假设这是因为我无法改变Ogre的来源)有没有一种方法可以过滤转储以显示我的代码中的泄漏?

谢谢!

编辑:我忘记了泄漏检测的输出(我只提供了一些,因为有很多)

  

检测到内存泄漏!倾倒物体    - &GT; {2123}正常阻塞位于0x036073A8,32个字节长。数据:69 6D 61 67 69 6E 61 74 69 6F 6E   20 74 65 63 68

     

{355}正常阻塞位于0x008CB2B8,140   字节长。数据:&lt; a&gt;   94 0B 61 01 00 00 00 00 CD CD CD CD 00   00 00 00

     

{351}正常阻塞位于0x008CB058,12   字节长。数据:58   B0 8C 00 58 B0 8C 00 CD CD CD CD

     

{350}正常阻塞位于0x008C4EB8,12   字节长。数据:&lt; N N> B8   4E 8C 00 B8 4E 8C 00 CD CD CD CD

     

{349}正常阻止位于0x008CAF78,160   字节长。数据:&lt; ,d x d&gt;   20 2C 05 64 CD CD CD CD 78 E8 04 64 CD   CD CD CD

     

{348}正常阻止位于0x008CAF08,48   字节长。数据:   4F 67 72 65 2F 53 68 61 64 6F 77 45 78   74 72 75

     

{347}正常阻止位于0x008CAE98,48   字节长。数据:   4F 67 72 65 2F 53 68 61 64 6F 77 45 78   74 72 75

     

{346}正常阻止位于0x008CAE28,48   字节长。数据:   4F 67 72 65 2F 53 68 61 64 6F 77 45 78   74 72 75

     

{345}正常阻止位于0x008CADB8,48   字节长。数据:   4F 67 72 65 2F 53 68 61 64 6F 77 45 78   74 72 75

     

{344}正常阻止位于0x008CAD58,32   字节长。数据:   4F 67 72 65 2F 53 68 61 64 6F 77 45 78   74 72 75

     

{343}正常块,位于0x008CACF8,32   字节长。数据:   4F 67 72 65 2F 53 68 61 64 6F 77 45 78   74 72 75

     

{342}正常阻止位于0x008CAC88,48   字节长。数据:   4F 67 72 65 2F 53 68 61 64 6F 77 45 78   74 72 75

     

{341}正常阻止位于0x008CAC28,32   字节长。数据:   4F 67 72 65 2F 53 68 61 64 6F 77 45 78   74 72 75

     

{340}正常阻止位于0x008CAB38,176   字节长。数据:   73 74 72 75 63 74 20 56 53 5F 4F 55 54   50 55 54

     

{339}正常阻止位于0x008CA808,752   字节长。

2 个答案:

答案 0 :(得分:0)

您可以避免使用所有编译器Kung Fu并在运行时直接使用windbg来检测内存泄漏。请参阅here进行一些演练。 windbg将直接告诉您泄漏源自何处。关于这个主题的一本非常好的书是Advanced Windows Debugging: Developing and Administering Reliable, Robust, and Secure Software

我知道这不是你问题的直接答案,但我已经尝试了你现在尝试的路线并且很快就放弃了。

答案 1 :(得分:0)

我找不到解决这个问题的方法。如果有人确实找到了解决方案,我会改变他们的答案,否则答案是,不要浪费你的时间,找一个好的检漏仪:))