我正在使用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。
对我而言,这意味着我应该能够这样做。有人有想法么?预先感谢!
答案 0 :(得分:1)
好吧,原来我是个假人,忘了包含一个重要的细节:我的应用程序还使用QJSEngine::newQObject
将我的“ JavaScript接口”对象公开给JS引擎,所以我几乎只是在重新创建this issue。
解决方案完全相同:使用QQmlEngine::setObjectOwnership
可以解决问题。
答案 1 :(得分:0)
确保没有剩余的QJSValue。
或者,如果您只想清除状态。清除QJSEngine :: globalObject(),或者只是避免使用JS根状态,这样项目之间就不会泄漏任何内容。