我有一个名为ToReturn
的QObject子类(使用QML注册)和一个用C ++定义的QML单例,称为MySingleton
。后者提供了这个功能:
Q_INVOKABLE ToReturn* get_toReturn() {
return new ToReturn();
}
当我从QML调用get_toReturn
时,我是否负责稍后在返回的对象上调用destroy()?或者有没有办法为此使用自动内存管理?
请注意,我的ToReturn对象在逻辑上不属于对象树,因此我将nullptr传递给父构造函数(QObject' s)。
答案 0 :(得分:1)
它应该自动工作,并且一旦它们超出范围就没有对象被删除,没有父对象,也没有对它们的引用。
话虽如此,有两点需要注意:
对象很少被销毁。他们往往会流连一段时间,除非强制收集垃圾
在更复杂的场景中,对象将被删除,即使它们有父对象和对它们的引用。这是一个critical bug,现在已经存在了将近2年,不幸的是,它完成了零工作。这迫使我使用手动对象生命周期管理,明确地将所有权设置为CPP,这样对象就不会丢失,这只会导致应用程序崩溃
默认情况下,从您的函数返回的对象将具有QQmlEngine::JavaScriptOwnership
,除非您通过以下方式明确设置它:
QQmlEngine::setObjectOwnership(objectptr, QQmlEngine::CppOwnership);
编辑:请注意,过早删除与JS所有权有关,因此完全以QML声明和创建的对象也受其约束。您可以为此类对象设置CPP所有权以保护它们,并且只能从C ++中删除此类对象,最好使用deleteLater()
。