Qt小部件内存管理

Qt Widget Memory Management

本文关键字:管理 内存 小部 Qt      更新时间:2023-10-16

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

小部件被它们的父部件销毁(例如,当您调用layout->addWidget时,布局获取传递的小部件的所有权)。在您的情况下,window将在作用域结束时被销毁(当app.exec返回时),这反过来将破坏布局,这反过来将破坏标签和编辑框。

对象树&Qt文档中的所有权

Qt构建了一个内部的东西树(布局,小部件,对话框,…),被释放,只要Qt认为这是好的。这个层次结构是用"things"的构造函数中的父参数构建的,或者当责任被其他函数调用(如addWidget)转移时。所以你甚至不允许删除"东西",当Qt或一些小部件已经接管了责任。

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