所以我对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自动处理的内存管理。因为看着这个,我不得不相信存在内存泄漏,因为没有任何东西被释放。
答案 0 :(得分:9)
小部件被他们的父母破坏(例如,当你调用layout->addWidget
时,布局获得传递的小部件的所有权),当这些小部件被销毁时。在您的情况下,window
将在范围的末尾(当app.exec
返回时)被销毁,这反过来将破坏布局,这反过来将破坏标签和编辑框。
答案 1 :(得分:0)
在Qt中,基于层次结构释放对象。即当QObject被释放时,所有它的子节点都将被释放(基于作为参数传递给对象构造函数的父节点)。
答案 2 :(得分:0)
Qt构建了一个内部的事物树(布局,窗口小部件,对话框......),只要Qt认为这是可以的,就可以释放它们。这个层次结构是在“事物”的构造函数中使用parent-parameter构建的,或者是通过某些其他函数调用(如addWidget)传递责任时构建的。因此,当Qt或某个小部件接管了责任时,您甚至不被允许删除“事物”。请参阅Qt中的文档。