Qt控件的内存管理

4

我对Qt的内存管理有些困惑。我正在查看一些入门样例和教程,看到了这个:

 QApplication app(argc, argv);
 QWidget window;
 QLabel *label = new QLabel(QApplication::translate("windowlayout", "Name:"));
 QLineEdit *lineEdit = new QLineEdit();

 QHBoxLayout *layout = new QHBoxLayout();
 layout->addWidget(label);
 layout->addWidget(lineEdit);
 window.setLayout(layout);
 window.setWindowTitle(
     QApplication::translate("windowlayout", "Window layout"));
 window.show();
 return app.exec();

读完这段代码我没看到任何释放内存的行为,他们在创建新的小部件时没有做任何的内存释放处理。不知道这是教程中为了避免混淆而特意省略了释放内存的步骤还是Qt自动处理了内存管理。从这段代码来看,我认为可能存在内存泄漏的问题,因为没有任何东西被释放。


如果它们被释放了,该应用程序将不再存在。这些都是顶级对象,直到应用程序关闭时才存在。 - Brian Roach
3个回答

10
小部件被它们的父级销毁(例如,当调用layout->addWidget时,布局将拥有传递的小部件),当这些小部件被销毁时。在您的情况下,window将在作用域末尾(当app.exec返回时)被销毁,然后会销毁布局,进而销毁标签和文本框。
Qt文档中有关“对象树和所有权”的相关内容,请参考:Object Trees & Ownership

1

Qt 构建了一个内部的树形结构(布局、小部件、对话框等),每当 Qt 认为可以释放时就会释放。这个层次结构是通过“things”构造函数中的 parent 参数或者在其他函数调用(如 addWidget)中转移责任时建立的。因此,当 Qt 或某个小部件接管责任时,您甚至不允许删除“things”。请参阅 Qt 中的文档。


0
在Qt中,对象的释放基于层次结构。例如,当QObject被释放时,所有它的子元素也将被释放(基于作为对象构造函数参数传递的父级)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接