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


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

最佳答案

好的,事实证明,我是一个虚拟人,忘了包括一个重要的细节:我的应用程序还使用QJSEngine::newQObject将我的“ JavaScript接口”对象公开给JS引擎,因此我几乎只是重新创建了this issue

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

关于c++ - 如何清理或销毁QJSEngine?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55636171/

10-12 18:32