在以下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();
据我了解,此代码段并不完整,因为您需要在component上调用
delete
。根据http://doc.qt.io/qt-5/qqmlcomponent.html#create,QQmlComponent::create()
函数将返回的对象实例的所有权转移给调用方。目前很好。现在是我的问题-谁在上面的代码段中拥有
object
?就我而言,我将上面的代码片段放置在一个类的成员函数中,因此QQmlIncubator incubator
超出了范围,我只保留了component
和object
,它们都是它们所包含类的实例变量,因此我调用析构函数中的delete component
。我可以正确清理吗?那么
object
属于component
吗? object
什么时候被销毁?更新1
请参阅我的后续问题:Safely deleting QML component being used in StackView transition。
最佳答案
简短答案
您应该销毁被孵育的对象(如果孵育器成功完成),否则会发生内存泄漏。
如何管理所有权?
一个好的方法可能是使用object parent将所有权转移到 QObject::setParent
,例如转移到visual parent。这也是done by Qt when you construct QML objects in the traditional way:
推理
如 QQmlComponent::create(QQmlContext *)
文档中所述,对象所有权已转移给用户:
因此,重载函数 QQmlComponent::create(QQmlIncubator &incubator, QQmlContext *context, QQmlContext *forContext)
不太可能保留所有权,尽管在文档中未明确提及。有人可能会争辩说所有权已转移到 QQmlIncubator
对象。只要组件是Loading
,实际上就是这种情况,一旦准备就绪,所有权就会(隐式地)发布在 QQmlIncubator::clear
中:
注意QQmlIncubator::clear
在QQmlIncubator
的析构函数内调用。