SDL内存泄漏和Visual Leak Detector

好的,所以我认为我的程序可能有内存泄漏。 这是一个SDL应用程序,它似乎变得太大,无法手动查明泄漏。 我搜索了一个相当于Valgrind的窗口(我正在运行Windows 7 x64并使用Visual Studio 2010),最终遇到了Visual Leak Detector。 不幸的是,它似乎不想生成输出。

我设置了另一个项目,一个空白的控制台应用程序,并按照我的SDL应用程序中的方式设置VLD。 运行该程序后,VLD完美工作,并捕获了我抛出的所有内存泄漏。 但在SDL应用程序中,它只输出“安装了Visual Leak Detector V2.2”。 在调试会话开始时,甚至当我在主函数中有意创建了一个内存泄漏的时候。

我可以说最接近的一点是,它可能与SDL与程序入口点拧紧有关。 但这只是一个猜测。 有什么方法让VLD与SDL一起工作?


你可以尝试deleaker 。 它是调试内存泄漏的强大工具。


我也有使用SDL库的类似问题。 就我而言,我试图使用Visual Studio 2010的默认内存泄漏检测,因为我不想使用第三方库/应用程序。

解决问题

如果毕竟所需的包含,定义和函数调用你仍然没有看到任何内存泄漏打印出来,这可能是你的运行时库设置不正确。

仔细检查是否有运行时库的调试版本,而不是非调试版本(/ MT和/ MD)。

多线程调试(/ MTd)

多线程调试DLL(/ MDd)

编译器在指定/ MTd或/ Mdd选项时定义_DEBUG。 这些选项指定C运行时库的调试版本。 请参阅_DEBUG参考MSDN

因此,必须定义_DEBUG符号才能启用CRT代码。

[...]当_DEBUG未定义时,在预处理[...]期间移除对_CrtSetDbgFlag的调用。 请参阅MSDN参考

因此,构建调试版本不足以确保_DEBUG将被定义。

这是您在正常项目中通常不会更改的内容,但遵循SDL教程可能会导致您遇到我。

希望它会帮助别人,甚至你。

更多细节如下

我正在关注MSDN页面,以启用VS 2010开箱即用的内存泄漏检测功能。

宣布这些之后

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

我启用它们到我的代码中,并插入了一个故意的内存泄漏

int main( int argc, char* args[] )
{
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

    int *pArray = (int*)malloc(sizeof(int) * 24); // Memory not freed

    return 0;
}

没有打印出来。

所以,我看着程序集,它完全不会生成CRT代码,正如你所看到的:

int main( int argc, char* args[] )
{
012932F0  push        ebp  
012932F1  mov         ebp,esp  
012932F3  sub         esp,0CCh  
012932F9  push        ebx  
012932FA  push        esi  
012932FB  push        edi  
012932FC  lea         edi,[ebp-0CCh]  
01293302  mov         ecx,33h  
01293307  mov         eax,0CCCCCCCCh  
0129330C  rep stos    dword ptr es:[edi]  
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG ); // Nothing in both case!

    int *pArray = (int*)malloc(sizeof(int) * 24);
0129330E  mov         esi,esp  
01293310  push        60h  
01293312  call        dword ptr [__imp__malloc (129E4CCh)]  
01293318  add         esp,4  
0129331B  cmp         esi,esp  
0129331D  call        @ILT+580(__RTC_CheckEsp) (1291249h)  
01293322  mov         dword ptr [pArray],eax  

然后,我意识到_DEBUG符号可能没有被定义。

链接地址: http://www.djcxy.com/p/57039.html

上一篇: SDL memory leaks and Visual Leak Detector

下一篇: debugging in mixed mode with native C++, managed c++ cli, and c# solution