谁拥有QQmlIncubator返回的对象? 在下面的C++代码中,QQL组件是使用QQMLIGBUTAL创建的。Qt文档包含以下代码段:
据我所知,这段代码并不完全完整,因为您需要在组件上调用delete。根据,QQmlComponent::create函数将返回对象实例的所有权转移给调用方。到目前为止还不错 现在我的问题是谁拥有上面片段中的对象?在我的例子中,我将上面的代码片段放在一个类的成员函数中,因此QQmlIncubator孵化器超出了范围,我只保留组件和对象,它们都是其包含类的实例变量,我在析构函数中调用delete组件。我打扫干净了吗 那么对象是否属于组件?物体什么时候被摧毁 更新1 请参阅我的后续问题:。简短回答 如果孵化器成功完成,则应销毁孵化对象,否则会发生内存泄漏 如何管理所有权 一个好的方法可能是将所有权转让给使用者,例如转让给。这也是: 指定给项目属性的任何对象都将成为项目的子对象 其QObject层次结构中的项,用于内存管理 为方便起见,Item属性是它的 推理 如文档中所述,对象所有权转移给用户: 返回对象实例的所有权转移给调用方 因此,重载函数不太可能保留所有权,尽管文档中没有明确提到它。有人可能会争辩说所有权转移给了对象。事实上,只要组件正在加载,一旦组件准备就绪,所有权就会被释放,隐式记录在: 任何正在进行的孵化都将中止。如果孵化器处于就绪状态,则不会删除创建的对象 请注意,QQmlIncubator::clear在QQmlIncubator的析构函数内调用。简短回答 如果孵化器成功完成,则应销毁孵化对象,否则会发生内存泄漏 如何管理所有权 一个好的方法可能是将所有权转让给使用者,例如转让给。这也是: 指定给项目属性的任何对象都将成为项目的子对象 其QObject层次结构中的项,用于内存管理 为方便起见,Item属性是它的 推理 如文档中所述,对象所有权转移给用户: 返回对象实例的所有权转移给调用方 因此,重载函数不太可能保留所有权,尽管文档中没有明确提到它。有人可能会争辩说所有权转移给了对象。事实上,只要组件正在加载,一旦组件准备就绪,所有权就会被释放,隐式记录在: 任何正在进行的孵化都将中止。如果孵化器处于就绪状态,则不会删除创建的对象谁拥有QQmlIncubator返回的对象? 在下面的C++代码中,QQL组件是使用QQMLIGBUTAL创建的。Qt文档包含以下代码段:,c++,qt,qml,C++,Qt,Qml,据我所知,这段代码并不完全完整,因为您需要在组件上调用delete。根据,QQmlComponent::create函数将返回对象实例的所有权转移给调用方。到目前为止还不错 现在我的问题是谁拥有上面片段中的对象?在我的例子中,我将上面的代码片段放在一个类的成员函数中,因此QQmlIncubator孵化器超出了范围,我只保留组件和对象,它们都是其包含类的实例变量,我在析构函数中调用delete组件。我打扫干净了吗 那么对象是否属于组件?物体什么时候被摧毁 更新1 请参阅我的后续问题:。简短回答 如
请注意,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;
}