好吧,所以我认为我的程序可能有内存泄漏。这是一个SDL应用程序,它似乎已经变得太大,我无法手动查明泄漏。我在周围寻找相当于Valgrind的Windows(我正在运行Windows 7 x64并使用Visual Studio 2010),最终遇到了Visual Leak Detector。不幸的是,它似乎不想产生任何输出。
我设置了另一个项目,一个空的控制台应用程序,并以与我的SDL应用程序相同的方式设置VLD。在运行程序时,VLD工作得很好,并且抓住了我扔给它的每一个内存泄漏。但在SDL应用程序中,它只输出“安装了Visual Leak Detector 2.2版”。在调试会话开始时没有别的,即使我故意在主函数中创建内存泄漏。
我最接近的是,它可能与SDL拧紧程序入口点有关。但这只是猜测。有没有办法让VLD与SDL一起使用?
答案 0 :(得分:2)
您可以尝试deleaker
。它是调试内存泄漏的强大工具。
答案 1 :(得分:0)
我也有使用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符号可能没有被定义。