【问题标题】:Shall I delete QObject pointers after using them?我应该在使用 QObject 指针后删除它们吗?
【发布时间】:2017-01-11 11:13:59
【问题描述】:

在 Qt 5.7.0 中使用 QObject 指针后,我应该删除它们吗?

例如,我得到了代码:

std::string login;
std::string password;
if (serviceId == 11) {
    QObject* loginField = this->parent()->findChild<QObject*>("wifiLogintxt1");
    QObject* passwordField = this->parent()->findChild<QObject*>("wifiPasswordtxt1");
    login = loginField->property("text").toString().toStdString();
    password = passwordField->property("text").toString().toStdString();
} else {
    QObject* loginField = this->parent()->findChild<QObject*>("inputField1");
    login = loginField->property("text").toString().toStdString();
}

代码会不会因为我们不删除QObject指针而导致内存泄露?

【问题讨论】:

  • 不,不要在 Qt 中删除那些指针
  • 指针应由其所有者删除。我想父小部件是您的 QObjects 变量的所有者。所以你不应该删除它们。

标签: c++ qt


【解决方案1】:

不,您不应该删除这些对象,它们由它们的父级 QObjects 管理,请参阅 QObject trees and ownership

当使用findChild 时,您将获得一个指向由该父级管理的同一对象的指针。

因此,loginFieldpasswordField 在其父小部件被删除时被删除(在您的情况下为 this 实例)。如果删除它们,它们将从 GUI 中消失。您必须保留它们,直到父小部件决定不再需要它们(即它被销毁的时间):

您也可以自己删除子对象,它们会将自己从父对象中删除。例如,当用户移除工具栏时,可能会导致应用程序删除其中一个 QToolBar 对象,在这种情况下,工具栏的 QMainWindow 父级会检测到更改并相应地重新配置其屏幕空间。

【讨论】:

  • 想象一下我们反复调用上面的代码的情况。它将创建新的QObject* loginField,因此会使用更多内存,对吧?
  • 不,loginField 将始终获得指向由父级管理的同一对象的指针(正如我在回答中所说)。因此,没有进行额外的分配。
猜你喜欢
  • 2011-05-18
  • 2011-10-04
  • 2012-12-29
  • 1970-01-01
  • 2015-02-07
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多