如何清理或销毁QJSEngine?

How to clean up or destroy QJSEngine?

我正在使用 Qt 5.12 构建一个应用程序,用户将加载 JS 脚本,通过 API 与应用程序交互。这些脚本被捆绑成"projects"(即相互依赖的多个JS模块),任何时候我都希望只有一个项目被加载到JS引擎中,所以如果用户加载不同的项目,我想要要清理的先前上下文。

根据文档,我假设如果我只是删除 QJSEngine 对象并创建一个新对象,这将允许我创建一个新的 JS 上下文。

QJSEngine* jsEngine = new QJSEngine();

// Load JS modules and run code...

jsEngine->collectGarbage();
delete jsEngine;

jsEngine = new QJSEngine();

// Load new JS modules...

当我尝试 运行 这段代码时,我在 delete jsEngine 处遇到访问冲突异常。这真的很奇怪,因为文档本身说明

Garbage is not collected from the persistent JS heap during QJSEngine destruction. If you need all memory freed, call collectGarbage manually right before destroying the QJSEngine.

这对我来说意味着我应该能够做到这一点。谁有想法?提前致谢!

确保您周围没有任何剩余的 QJSValues。

或者,如果您只想清理状态。清除 QJSEngine::globalObject(),或者只是避免使用根 JS 状态,这样项目之间就不会泄漏。

好吧,事实证明我是个傻瓜,忘了包含一个重要的细节:我的应用程序还使用 QJSEngine::newQObject 将我的 "JavaScript interface" 对象暴露给 JS 引擎,所以我很漂亮很多只是重新创建 this issue.

解决方案完全相同:使用 QQmlEngine::setObjectOwnership 可以解决问题。