0

我正在使用 Qt 5.12 组合一个应用程序,用户将在其中加载通过其 API 与应用程序交互的 JS 脚本。这些脚本被捆绑到“项目”中(即多个相互依赖的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. 这真的很奇怪,因为文档本身就说明了

QJSEngine 销毁期间不会从持久 JS 堆中收集垃圾。如果您需要释放所有内存,请在销毁 QJSEngine 之前手动调用 collectGarbage。

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

4

2 回答 2

1

好的,结果我是个傻瓜,忘记包含一个重要细节:我的应用程序还使用 JS 引擎向 JS 引擎公开我的“JavaScript 接口”对象QJSEngine::newQObject,所以我几乎只是重新创建了这个问题

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

于 2019-04-25T22:10:39.027 回答
0

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

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

于 2019-04-24T13:40:51.773 回答