问:以下代码中是否有内存泄漏?

时间:2014-03-20 01:57:26

标签: qt

作为Qt的新手,我只是在徘徊,以下简单的代码是否会有任何内存泄漏。

#include <QtGui>
int main(int argc, char * argv[])
{
    QApplication app(argc, argv);
    QMainWindow *win = new QMainWindow();
    win->show();
    return app.exec();
}

此代码运行正常。但是QMainwindow正在堆中创建,而似乎没有合适的位置从堆中向delete插入语句。虽然程序堆空间似乎会在程序终止后释放。在编写Qt程序时,我觉得这是否是一个好的风格。

我在一些Qt示例中看到了这种Qt编程风格。所以我在这里提出问题的建议。

感谢您的任何想法。

3 个答案:

答案 0 :(得分:4)

Qt非常依赖于资源清理的对象/窗口小部件层次结构。子窗口小部件是其父窗口小部件的子对象,因此当父窗口被删除时,子窗口也会被清除。

因此,我建议您确保正确删除QMainWindow,因此在添加子窗口小部件时,您可以知道在程序关闭时它们的所有资源都已正确销毁。

要执行此操作,请在main()

中分配堆栈上的主窗口
QMainWindow win;
win.show();

或者使用各种智能指针类之一来确保清理:

QScopedPointer<QMainWindow> win = new QMainWindow;
win->show();

答案 1 :(得分:1)

这不是你需要过多担心的内存泄漏,但你可以通过让QMainWindow成为QApplication的孩子来解决它:

    QMainWindow *win = new QMainWindow(&app);

QObjects例如QApplication删除所有子对象。因此,在这种情况下,QApplication会在QMainWindow超出范围时删除app

答案 2 :(得分:0)

您可以将显示设置为窗口小部件,并将其放在主窗口中。这将更加灵活,并使您能够控制主窗口的膨胀。但这更多是关于设计而不是关于Qt本身......