How to detect memory leaks in QtCreator on Windows?(如何在 Windows 上的 QtCreator 中检测内存泄漏?)
问题描述
如何在 Windows 上的 QtCreator 中检测内存泄漏?在文档上,他们推荐 Memcheck,但它仅适用于 Mac 和 Linux.对 Windows 有什么建议吗?
How can I detect memory leaks in QtCreator on Windows? On the doc, they recommend Memcheck but it only works on Mac and Linux. Any suggestion for Windows?
推荐答案
经过多次尝试,我终于找到了一种在 Windows 上检测 Qt 项目内存泄漏的方法:
After many tries I finally found a method to detect the memory leaks of a Qt project on Windows:
1) 首先,它不能直接在Qt Creator中完成,因此您需要创建一个Visual C++项目来进行内存泄漏检测.值得庆幸的是,qmake 使这变得容易.打开Qt SDK命令行工具,运行:
1) First, it cannot be done directly in Qt Creator so you need to create a Visual C++ project to do the memory leak detection. Thankfully, qmake makes this easy. Open the Qt SDK command line tool and run:
qmake -spec win32-msvc2008 -tp vc
这会将您的项目转换为 .vcproj.
This will convert your project to a .vcproj.
2) 打开这个项目并添加必要的内存泄漏检测代码:
2) Open this project and add the necessary code for memory leak detection:
到您的 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!
", 10) == 0)
|| ignoreMessage)
{
// check if the memory leak reporting ends
if (strncmp(message,"Object dump complete.
", 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.
3) With this, your project should now be able to detect memory leaks. Note the _MSC_VER
defines so that this code is only executed when your run it from Visual C++ (not from Qt Creator). It means you can still do the development with Qt Creator and just re-run step 1 whenever you need to check for memory leaks.
4) 要中断特定的内存分配,请使用 _CrtSetBreakAlloc()
Microsoft 网站上的更多信息内存泄漏检测:http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.80%29.aspx
4) To break at a particular memory allocation, use _CrtSetBreakAlloc()
More information memory leak detection on Microsoft's website: http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.80%29.aspx
这篇关于如何在 Windows 上的 QtCreator 中检测内存泄漏?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何在 Windows 上的 QtCreator 中检测内存泄漏?
基础教程推荐
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01