如何清理或销毁QJSEngine?
How to clean up or destroy 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 。
对我来说,这意味着我应该能够做到这一点。有人有什么想法吗?提前感谢!
好吧,事实证明我是一个假人,忘记包含一个重要的细节:我的应用程序还使用QJSEngine::newQObject
向 JS 引擎公开我的"JavaScript 接口"对象,所以我几乎只是在重现这个问题。
解决方案完全相同:使用QQmlEngine::setObjectOwnership
使问题消失。
确保你没有任何剩余的QJSValues。
或者,如果您只想清理状态。清除 QJSEngine::globalObject(),或者只是避免使用根 JS 状态,这样项目之间就不会泄漏任何内容。
相关文章:
- 函数何时会在c++中包含stack_Unwind_Resume调用
- rcpp函数中的清理时间很长
- Python中的for循环与C++有何不同
- 使用QJsEngine在Qt中注册自定义类型
- 为什么 ulimit -v 在 Clang 的地址清理器下不起作用?
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 在C++中释放内存期间,迭代器与指针有何不同
- 即发即弃 std::线程对象清理自身
- 内存清理程序报告全局对象构造中未初始化值的使用
- 并行块(线程清理器)之外的 OpenMP 中的争用条件;误报?
- 为什么我得到以下代码地址清理器:未知地址错误的SEGV
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 应用地址清理器后,免费无效指针消失
- 如何注册枚举类型到QJSEngine,以便在脚本环境中使用?
- 清理"QSettings"注册表项的最佳方法(Windows上的Qt 5)
- 变体 - 分配新值时是否清理旧值?
- 我将如何清理这些 If 语句?
- 类中的 C++ int 被设置为值,似乎不知从何而来
- 如何清理或销毁QJSEngine?