【问题标题】:SDL memory leaks and Visual Leak DetectorSDL 内存泄漏和视觉泄漏检测器
【发布时间】:2011-12-13 19:05:57
【问题描述】:

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

我设置了另一个项目,一个空的控制台应用程序,并以与我的 SDL 应用程序相同的方式设置 VLD。运行程序后,VLD 运行良好,并捕获了我扔给它的每一个内存泄漏。但在 SDL 应用程序中,它只输出“已安装 Visual Leak Detector 2.2 版”。在调试会话开始时,没有别的,即使我故意在主函数中创建了内存泄漏。

据我所知,这可能与 SDL 搞砸程序入口点有关。但这只是一个猜测。有什么方法可以让 VLD 与 SDL 一起工作?

【问题讨论】:

  • 我想知道您是否找到了解决该问题的方法?我现在有完全相同的问题,我几乎做了和你一样的步骤。独立运行,但不适用于 SDL。

标签: visual-studio memory-leaks sdl memory-leak-detector


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    解决问题

    如果在完成所有必需的包含、定义和函数调用之后,您仍然没有看到打印出任何内存泄漏,则可能是您的运行时库设置不正确。

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

    多线程调试 (/MTd)

    多线程调试 DLL (/MDd)

    当您指定 /MTd 或 /Mdd 选项时,编译器会定义 _DEBUG。这些选项指定 C 运行时库的调试版本。 See _DEBUG reference MSDN

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

    [...] 如果未定义 _DEBUG,则在预处理期间删除对 _CrtSetDbgFlag 的调用 [...]。 See MSDN reference

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

    这是您在普通项目中通常不会更改的内容,但遵循 SDL 教程可能会让您成为我原来的样子。

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

    更多详情如下

    我关注MSDN page 以启用 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 符号可能没有被定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2011-07-31
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      相关资源
      最近更新 更多