15

我是 mac 和仪器的新手,我用它来测试我的 Qt 应用程序,我发现了很多泄漏的对象,几乎所有这些对象都来自 Qt lib。我非常仔细地检查了我的代码,但找不到问题。为了避免内存泄漏的问题,我严格遵守 RAII 的规则,总是让类处理资源,确保每个小部件都有一个父级,那些没有父级(意图)的小部件将由智能指针或 Qt::WA_DeleteOnClose 保护。

为了修复内存泄漏警告,我编写了一个非常简单的 Qt 应用程序并将其用作测试,仪器总是显示我有一些内存泄漏(如图),即使是我创建的最简单的 Qt 应用程序。

    #include <QApplication>
    #include <QLabel>

        int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);


        QLabel w;
        w.resize(320, 240);
        w.show();

        return a.exec();
    }

仪器图表

调用树

泄漏的物体

我稍微修改了代码,然后看到 Instruments 显示的内存泄漏是否会持续上升。

#include <QApplication>
    #include <QLabel>

        int main(int argc, char *argv[])
       {
        QApplication a(argc, argv);


        for(size_t i = 0; i != 100; ++i){
        QLabel w;
        w.resize(320, 240);
        w.show();
       }
       QLabel w;
       w.resize(320, 240);
       w.show();

        return a.exec();
    }

调用树 泄漏的物体

内存泄漏确实增加了,我强烈希望这是仪器的错误,否则我不得不退回到Qt4(我不知道它是否会出现同样的问题)。我认为这并不简单应用程序可以通过mac应用商店(OSX)的质量检查。这是怎么回事?我应该如何解释这种现象?如果没有内存泄漏,我应该看不到泄漏对象的任何消息,对吗?Qt5.0.2的一个bug?

4

1 回答 1

2

内存确实被泄露了,这是一个受信任的框架绝不应该这样做的。

基本上,框架应该使用智能指针,或者应该“手动”跟踪和处理有问题的内存泄漏。

如果没有泄漏,那么所有内存将在使用后返回到堆中。

根据bugreports.qt-project.org/browse/QTBUG-7505 ,此错误位于 4.6.0 版中。

于 2013-05-18T23:22:11.743 回答