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