1

我正在使用 Visual Studio 2008 在 Windows 上构建 Qt 4.5 应用程序。每当我在调试模式下运行我的应用程序然后将其关闭时,Visual Studio 都会在输出窗格中打印以下内容:

检测到内存泄漏!
转储对象 ->
{696512} 位于 0x01981AB0 的普通块,24 字节长。
数据:< > 00 CD CD CD 00 00 00 00 00 00 00 00 00 00 00 00
{696511} 正常块位于 0x02E59B70,12 字节长。
数据:<U2g U2g> B0 1A 98 01 E8 55 32 67 E8 55 32 67

并且输出报告了数百个这样的块。在使用 Qt 4 的模型/视图框架时,我特别注意到了这一点。Qt 实际上是否存在内存泄漏,或者是否存在 Visual Studio 误报泄漏的情况?

4

4 回答 4

5

内存泄漏信息由调试窗口运行时提供。您的程序可以交互和配置它。

大括号{696512}中的数字是分配订单号。如果这个数字总是相同的,那么你可以通过将数字传递给这个分配来设置一个断点_CrtSetBreakAlloc。再次在调试器中运行程序,当泄漏的内存被分配时,调试器将停止。

在 main 中尽早调用此函数。如果数字并不总是相同,请尝试用减少的代码重现内存泄漏,直到它总是相同。

有关详细信息,请参阅使用 CRT 库查找内存泄漏

于 2009-06-18T17:04:06.557 回答
2

我有机会使用 DevPartner 来分析我的项目。令人惊讶的是,它报告了 QtGuid4.dll 和 QtCored4.dll 中的内存泄漏;但是,在手动查看每个案例后,我发现它们都是误报。

附带说明一下,使用 Qt 的代码中没有报告内存泄漏。

于 2009-07-27T15:26:55.140 回答
1

确保您在 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 开发基础”

于 2009-06-18T08:37:25.757 回答
0

我认为当内存泄漏检测器在 QT 进行清理之前检查泄漏时会发生这种情况。我通过将我的 qtmaind.lib、QtCored4.lib、QtGuid4.lib、QtOpenGLd4.lib 等移动到 VS 项目设置对话框中链接器依赖项框的底部来解决了这个问题。

于 2009-09-04T12:37:33.297 回答