Qt Widget内存管理

时间:2011-11-03 18:44:48

标签: c++ qt

所以我对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自动处理的内存管理。因为看着这个,我不得不相信存在内存泄漏,因为没有任何东西被释放。

3 个答案:

答案 0 :(得分:9)

小部件被他们的父母破坏(例如,当你调用layout->addWidget时,布局获得传递的小部件的所有权),当这些小部件被销毁时。在您的情况下,window将在范围的末尾(当app.exec返回时)被销毁,这反过来将破坏布局,这反过来将破坏标签和编辑框。

Qt docs中的

Object Trees & Ownership

答案 1 :(得分:0)

在Qt中,基于层次结构释放对象。即当QObject被释放时,所有它的子节点都将被释放(基于作为参数传递给对象构造函数的父节点)。

答案 2 :(得分:0)

Qt构建了一个内部的事物树(布局,窗口小部件,对话框......),只要Qt认为这是可以的,就可以释放它们。这个层次结构是在“事物”的构造函数中使用parent-parameter构建的,或者是通过某些其他函数调用(如addWidget)传递责任时构建的。因此,当Qt或某个小部件接管了责任时,您甚至不被允许删除“事物”。请参阅Qt中的文档。