如何检测Windows上的QtCreator内存泄漏?

如何检测Windows上的QtCreator内存泄漏? 在文档上,他们推荐使用Memcheck,但只能在Mac和Linux上使用。 任何build议的Windows?

所以经过多次尝试,我终于找到了一个方法来检测Windows上的Qt项目的内存泄漏:

1)首先,它不能直接在Qt Creator中完成,因此您需要创建一个Visual C ++项目来执行内存泄漏检测。 值得庆幸的是,qmake使这个很容易。 打开Qt SDK命令行工具并运行:

qmake -spec win32-msvc2008 -tp vc 

这会将您的项目转换为.vcproj。

2)打开这个项目并添加必要的内存泄漏检测代码:

到你的main.cpp文件中:

 // Necessary includes and defines for memory leak detection: #ifdef _MSC_VER #define _CRTDBG_MAP_ALLOC #include <crtdbg.h> #endif // _MSC_VER #if defined(_MSC_VER) // Code to display the memory leak report // We use a custom report hook to filter out Qt's own memory leaks // Credit to Andreas Schmidts - http://www.schmidt-web-berlin.de/winfig/blog/?p=154 _CRT_REPORT_HOOK prevHook; int customReportHook(int /* reportType */, char* message, int* /* returnValue */) { // This function is called several times for each memory leak. // Each time a part of the error message is supplied. // This holds number of subsequent detail messages after // a leak was reported const int numFollowupDebugMsgParts = 2; static bool ignoreMessage = false; static int debugMsgPartsCount = 0; // check if the memory leak reporting starts if ((strncmp(message,"Detected memory leaks!\n", 10) == 0) || ignoreMessage) { // check if the memory leak reporting ends if (strncmp(message,"Object dump complete.\n", 10) == 0) { _CrtSetReportHook(prevHook); ignoreMessage = false; } else ignoreMessage = true; // something from our own code? if(strstr(message, ".cpp") == NULL) { if(debugMsgPartsCount++ < numFollowupDebugMsgParts) // give it back to _CrtDbgReport() to be printed to the console return FALSE; else return TRUE; // ignore it } else { debugMsgPartsCount = 0; // give it back to _CrtDbgReport() to be printed to the console return FALSE; } } else // give it back to _CrtDbgReport() to be printed to the console return FALSE; } #endif int main(int argc, char *argv[]) { #if defined(_MSC_VER) _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); prevHook = _CrtSetReportHook(customReportHook); // _CrtSetBreakAlloc(157); // Use this line to break at the nth memory allocation #endif QApplication* app = new QApplication(argc, argv); int appError = app->exec(); delete app; #if defined(_MSC_VER) // Once the app has finished running and has been deleted, // we run this command to view the memory leaks: _CrtDumpMemoryLeaks(); #endif return appError; } 

3)用这个,你的项目现在应该能够检测内存泄漏。 请注意_MSC_VER定义,以便这个代码只有当你从Visual C ++(而不是从Qt Creator)运行时才能执行。 这意味着您仍然可以使用Qt Creator进行开发,只要需要检查内存泄漏,只需重新运行第1步。

4)要打破特定内存分配,请使用_CrtSetBreakAlloc()更多信息Microsoft网站上的内存泄漏检测: http : //msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.80%29.aspx

新2017年解决方案

引用@this.lau_

首先,它不能直接在Qt Creator中完成,因此您需要创建一个Visual C ++项目来执行内存泄漏检测。 值得庆幸的是,qmake使这个很容易。

1)打开Qt SDK命令行工具并运行:

qmake -spec win32-msvc2015 -tp vc

2) 为Visual C ++安装Visual Leak Detector

3)打开使用第1步创建的.vcxproj

4)包含到你的main.cpp

#include <vld.h>

5)启动DebugView v4.81

6)比运行你的项目ctrl + F5