在关闭Qt 4.5应用程序时,Visual Studio报告它已检测到内存泄漏
-
06-07-2019 - |
题
我正在使用Visual Studio 2008在Windows上构建Qt 4.5应用程序。每当我在调试模式下运行我的应用程序然后关闭它时,Visual Studio会将以下内容输出到输出窗格:
检测到内存泄漏!
转储对象 - <!> gt;
{696512}正常阻塞位于0x01981AB0,长度为24个字节。
数据:<!> lt; GT <!>; 00 CD CD CD 00 00 00 00 00 00 00 00 00 00 00 00
{696511}正常阻塞位于0x02E59B70,长度为12个字节。
数据:<!> lt; U2g U2g <!> gt; B0 1A 98 01 E8 55 32 67 E8 55 32 67
输出报告了数百个这样的块。我注意到这一点特别是在使用Qt 4的Model / View框架时。 Qt实际上是否有内存泄漏,或者是否存在Visual Studio误报泄漏的情况?
解决方案 2
我有机会使用DevPartner来描述我的项目。令人惊讶的是,它报告了QtGuid4.dll和QtCored4.dll中的内存泄漏;然而,在手动查看每个案例之后,我发现它们都是误报。
作为旁注,使用Qt的代码中没有报告内存泄漏。
其他提示
内存泄漏信息由调试窗口运行时提供。您的程序可以进行交互和配置。
大括号中的数字{696512}
是分配订单号。如果此数字始终相同,则可以通过将数字传递给 _CrtSetBreakAlloc
。再次在调试器中运行程序,调试器将在分配泄漏的内存时停止。
在main中尽早调用此函数。如果数字并不总是相同,请尝试使用简化代码重现内存泄漏,直到它始终相同为止。
有关详细信息,请参阅内存泄漏检测启用
确保您在Qt-way中使用动态内存,例如
#include <QObject>
#include <QString>
class MyClass : public QObject
{
public:
MyClass (const QString& text, QObject *parent = 0);
...
};
int main()
{
QObject parent;
MyClass *a;
a = new MyClass ("foo", &parent);
...
}
(c)Johan Thelin,<!>“Qt发展的基础<!>
我认为这是在内存泄漏检测器在QT进行清理之前检查泄漏时发生的。我通过将qtmaind.lib,QtCored4.lib,QtGuid4.lib,QtOpenGLd4.lib等移动到VS项目设置对话框中链接器依赖项框的底部来修复此问题。