谁拥有QQMlinCubator返回的对象
Who owns object returned by QQmlIncubator?
在以下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
不在范围中,我只保留component
和object
,这都是其包含类的实例变量,我称destructor中的delete component
。我要正确清理吗?
那么object
是否属于component
?object
什么时候被销毁?
更新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::clear
在 QQmlIncubator
的攻击者内被调用。
当前您的示例中,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;
}
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 从我的对象返回静态数组
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>
- 从右值对象返回成员
- 视觉对象 返回 C++ 中的双精度值
- 为什么类型为 sf::Text 的对象返回不同的 getPosition().y 和 getLocalBounds().
- std::min_element 从类对象返回意外结果
- C++无效的对象返回语义
- const引用是否延长临时对象返回的临时对象的寿命
- 将 NULL 作为对象返回时未收到任何警告
- 如何在 C# 中从 com 对象返回数组(double[])
- 从重载运算符返回引用,并使用临时对象返回表达式
- Cin 对象返回值 c++
- 将变量作为类对象返回
- 使用可更改对象返回只读的最佳方法是什么
- 如何在Cython中从另一个包装对象返回包装的c++对象
- 当对象返回时,c++动态数组被清除
- 从带有动态字段的函数、对象返回
- 从堆栈上的匿名对象返回对*this的引用