我试图在我的程序中找到泄漏,这是一个基于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 字节长。
答案 0 :(得分:0)
您可以避免使用所有编译器Kung Fu并在运行时直接使用windbg
来检测内存泄漏。请参阅here进行一些演练。 windbg
将直接告诉您泄漏源自何处。关于这个主题的一本非常好的书是Advanced Windows Debugging: Developing and Administering Reliable, Robust, and Secure Software。
我知道这不是你问题的直接答案,但我已经尝试了你现在尝试的路线并且很快就放弃了。
答案 1 :(得分:0)
我找不到解决这个问题的方法。如果有人确实找到了解决方案,我会改变他们的答案,否则答案是,不要浪费你的时间,找一个好的检漏仪:))