我正在使用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项目设置对话框中链接器依赖项框的底部来修复此问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top