谁拥有QQmlIncubator返回的对象? 在下面的C++代码中,QQL组件是使用QQMLIGBUTAL创建的。Qt文档包含以下代码段:

谁拥有QQmlIncubator返回的对象? 在下面的C++代码中,QQL组件是使用QQMLIGBUTAL创建的。Qt文档包含以下代码段:,c++,qt,qml,C++,Qt,Qml,据我所知,这段代码并不完全完整,因为您需要在组件上调用delete。根据,QQmlComponent::create函数将返回对象实例的所有权转移给调用方。到目前为止还不错 现在我的问题是谁拥有上面片段中的对象?在我的例子中,我将上面的代码片段放在一个类的成员函数中,因此QQmlIncubator孵化器超出了范围,我只保留组件和对象,它们都是其包含类的实例变量,我在析构函数中调用delete组件。我打扫干净了吗 那么对象是否属于组件?物体什么时候被摧毁 更新1 请参阅我的后续问题:。简短回答 如

据我所知,这段代码并不完全完整,因为您需要在组件上调用delete。根据,QQmlComponent::create函数将返回对象实例的所有权转移给调用方。到目前为止还不错

现在我的问题是谁拥有上面片段中的对象?在我的例子中,我将上面的代码片段放在一个类的成员函数中,因此QQmlIncubator孵化器超出了范围,我只保留组件和对象,它们都是其包含类的实例变量,我在析构函数中调用delete组件。我打扫干净了吗

那么对象是否属于组件?物体什么时候被摧毁

更新1 请参阅我的后续问题:。

简短回答

如果孵化器成功完成,则应销毁孵化对象,否则会发生内存泄漏

如何管理所有权

一个好的方法可能是将所有权转让给使用者,例如转让给。这也是:

指定给项目属性的任何对象都将成为项目的子对象 其QObject层次结构中的项,用于内存管理

为方便起见,Item属性是它的

推理

如文档中所述,对象所有权转移给用户:

返回对象实例的所有权转移给调用方

因此,重载函数不太可能保留所有权,尽管文档中没有明确提到它。有人可能会争辩说所有权转移给了对象。事实上,只要组件正在加载,一旦组件准备就绪,所有权就会被释放,隐式记录在:

任何正在进行的孵化都将中止。如果孵化器处于就绪状态,则不会删除创建的对象

请注意,QQmlIncubator::clear在QQmlIncubator的析构函数内调用。

简短回答

如果孵化器成功完成,则应销毁孵化对象,否则会发生内存泄漏

如何管理所有权

一个好的方法可能是将所有权转让给使用者,例如转让给。这也是:

指定给项目属性的任何对象都将成为项目的子对象 其QObject层次结构中的项,用于内存管理

为方便起见,Item属性是它的

推理

如文档中所述,对象所有权转移给用户:

返回对象实例的所有权转移给调用方

因此,重载函数不太可能保留所有权,尽管文档中没有明确提到它。有人可能会争辩说所有权转移给了对象。事实上,只要组件正在加载,一旦组件准备就绪,所有权就会被释放,隐式记录在:

任何正在进行的孵化都将中止。如果孵化器处于就绪状态,则不会删除创建的对象


请注意,QQmlIncubator::clear在QQmlIncubator的析构函数内调用。

正如您当前在示例中所写,对象销毁是您当前的责任。您很可能希望通过调用对象上的setParent来解决这个问题,从而将责任传递给父项

正如您所指出的组件->创建:

返回的对象实例的所有权将转移到 来电者

而孵化器给人留下了保留这一意图的所有表象

验证这一点的实验方法是检查从孵化器返回的对象的父对象

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

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


正如您的示例中当前所述,对象销毁是您当前的责任。您很可能希望通过调用对象上的setParent来解决这个问题,从而将责任传递给父项

正如您所指出的组件->创建:

返回的对象实例的所有权将转移到 来电者

而孵化器给人留下了保留这一意图的所有表象

验证这一点的实验方法是检查从孵化器返回的对象的父对象

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

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


快速浏览代码
,它看起来像根上下文。但是最好不要让对象生命周期管理偶然地快速浏览一下代码,它看起来像根上下文。但最好不要把对象生命周期管理留给偶然的机会,我不完全同意您检查对象父对象的实验方法。子-父关系只是管理Qt中所有权的一种常见方式。正如您在代码片段中指出的,只要对象正在加载,clear就拥有该对象的所有权,但它不是其父对象。好的,所以我需要删除该对象。但如果QML仍在使用它呢?您是否介意看一下我的后续问题:不会将所有权转移到可视父项。你应该改用。有关更多信息,请参阅。我不完全同意您检查对象父对象的实验方法。子-父关系只是管理Qt中所有权的一种常见方式。正如您在代码片段中指出的,只要对象正在加载,clear就拥有该对象的所有权,但它不是其父对象。好的,所以我需要删除该对象。但如果QML仍在使用它呢?您是否介意看一下我的后续问题:不会将所有权转移到可视父项。你应该改用。有关更多信息,请参阅。您的推理是有道理的。我需要发布一个后续问题,因为我的情况有点复杂,但这很好地解释了我原来的问题。接下来的问题是:根据文档,可视化父项由QQmlQuickItem::setParentItem:设置。我认为您关于使用QObject::setParent将所有权转移到可视父级的评论可能需要编辑。据我所知,QObject::setParent没有设置QML项的可视父项。@MatthewKraus您完全正确。我的更新版本更好吗?谢谢更新。总的来说,我认为这种方法是好的。你的推理是有道理的。我需要发布一个后续问题,因为我的情况有点复杂,但这很好地解释了我原来的问题。接下来的问题是:根据文档,可视化父项由QQmlQuickItem::setParentItem:设置。我认为您关于使用QObject::setParent将所有权转移到可视父级的评论可能需要编辑。据我所知,QObject::setParent没有设置QML项的可视父项。@MatthewKraus您完全正确。我的更新版本更好吗?谢谢更新。总的来说,我认为这种方法是好的。
QQmlIncubator incubator;
component->create(incubator);

while (!incubator.isReady()) {
    QCoreApplication::processEvents(QEventLoop::AllEvents, 50);
}

// Who owns 'object'? When is it deleted?
QObject *object = incubator.object();
if (s == Loading) {
    Q_ASSERT(d->compilationUnit);
    if (d->result) d->result->deleteLater();
    d->result = 0;
}