如何清理或销毁QJSEngine?

时间:2019-04-11 15:30:56

标签: c++ qt qjsengine

我正在使用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。

对我而言,这意味着我应该能够这样做。有人有想法么?预先感谢!

2 个答案:

答案 0 :(得分:1)

好吧,原来我是个假人,忘了包含一个重要的细节:我的应用程序还使用QJSEngine::newQObject将我的“ JavaScript接口”对象公开给JS引擎,所以我几乎只是在重新创建this issue

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

答案 1 :(得分:0)

确保没有剩余的QJSValue。

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