在以下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#createQQmlComponent::create()函数将返回的对象实例的所有权转移给调用方。目前很好。

现在是我的问题-谁在上面的代码段中拥有object?就我而言,我将上面的代码片段放置在一个类的成员函数中,因此QQmlIncubator incubator超出了范围,我只保留了componentobject,它们都是它们所包含类的实例变量,因此我调用析构函数中的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::clearQQmlIncubator的析构函数内调用。

09-07 06:20