谁拥有QQMlinCubator返回的对象

Who owns object returned by QQmlIncubator?

本文关键字:对象 返回 QQMlinCubator 拥有      更新时间:2023-10-16

在以下C 代码中,使用QQmlIncubator创建QML组件。QT文档中有此片段来自此处http://doc.qt.io/qt-5/qqmlincubator.html:

QQmlIncubator incubator;
component->create(incubator);
while (!incubator.isReady()) {
    QCoreApplication::processEvents(QEventLoop::AllEvents, 50);
}
// Who owns 'object'? When is it deleted?
QObject *object = incubator.object();

我的理解是,此片段并不完全完整,因为您需要在组件上调用delete。根据http://doc.qt.io/qt-5/qqmlcomponent.html#create,QQmlComponent::create()函数将返回对象实例的所有权转移给呼叫者。到目前为止很好。

现在是我的问题 - 在上面的摘要中拥有object?就我而言,我将上述片段放在类的成员函数中,因此QQmlIncubator incubator不在范围中,我只保留componentobject,这都是其包含类的实例变量,我称destructor中的delete component。我要正确清理吗?

那么object是否属于componentobject什么时候被销毁?

更新1

请参阅我的后续问题:安全删除stackView Transition中使用的QML组件。

简短答案

您应该破坏孵化的对象(如果孵化器成功完成(,否则会发生内存泄漏。

如何管理所有权?

一种好的方法可能是使用QObject::setParent将所有权传输到对象 ,例如 visual parent。当您以传统方式构造QML对象时,这也是由QT完成的:

分配给项目数据属性的任何对象都成为 用于内存管理目的的QObject层次结构中的项目。

为方便起见,项目数据属性是其默认属性。

推理

QQmlComponent::create(QQmlContext *)文档所述,对象所有权已转移给用户:

返回对象实例的所有权已转移到呼叫者。

因此,尽管未在文档中明确提及它,但不可能保留超载函数QQmlComponent::create(QQmlIncubator &incubator, QQmlContext *context, QQmlContext *forContext)。可以说,所有权已转移到QQmlIncubator对象。确实,只要组件是 Loading,就这样,一旦准备就绪,所有权就会按照QQmlIncubator::clear中的(隐式(记录:

中的(隐含(记录。

任何过程中的孵化都被中止。如果孵化器处于现成状态,则创建的对象为不是删除。

请注意,QQmlIncubator::clearQQmlIncubator的攻击者内被调用。

当前您的示例中,object破坏是您当前的责任。您很可能想通过在object上致电setParent()并因此将责任传递给父项目来照顾好。

您指出的是component->create()

将返回对象实例的所有权转移到 呼叫者。

和孵化器给出了保留该意图的所有外观。

验证此验证的一种实验方法是检查object的父级的父母。

验证此验证的另一种方法是直接查看QT中的相关源代码。这是QQmlIncubator的文件:

https://github.com/qt/qt/qtdeclarative/blob/dev/src/src/src/src/src/src/qml/qqmlincubator.cpp https https ://github.com/qtdect/qtdeclarative ,,qqmlincubator_p.hhttps://github.com/qt/qtdeclarative/blob/dev/src/src/qml/qml/qqmlincubator.h

检查这些文件,删除结果的唯一位置是在::clear方法中:

if (s == Loading) {
    Q_ASSERT(d->compilationUnit);
    if (d->result) d->result->deleteLater();
    d->result = 0;
}