quickjs - QuickJS:由于修改函数原型可能导致内存泄漏
问题描述
我在QuickJS JavaScript 引擎中遇到了似乎是一个错误。我已经提交了一个GitHub 问题,但我也在这里询问它是否可能是用户错误,和/或了解其他人是否遇到过类似的问题。
以下测试代码:
#include <string>
#include "quickjs.h"
int main() {
auto runtime = JS_NewRuntime();
auto context = JS_NewContext(runtime);
std::string source =
"function foo() {}\n"
"foo.prototype.bar = function() {};";
JS_Eval(context, source.c_str(), source.size(), "", JS_EVAL_TYPE_GLOBAL);
JS_FreeContext(context);
JS_FreeRuntime(runtime);
}
产生断言:
Assertion failed: (list_empty(&rt->gc_obj_list)), function JS_FreeRuntime
使用“转储泄漏”功能会输出以下内容:
Object leaks:
ADDRESS REFS SHRF PROTO CLASS PROPS
0x1071d4bc0 1 0* 0x1071c5510 Function { length: 0, name: 14'', prototype: [autoinit 0x1071c4e80 0 0x0] }
这似乎表明修改函数原型会导致内存泄漏。(如果未修改函数原型,则不会发生这种情况。)
我的测试代码有什么明显的问题吗?也许滥用 API?如果没有,是否有其他人遇到过这个问题或 QuickJS 的类似问题?
解决方案
对于将来可能偶然发现此问题的任何人,这是由于 API 使用不正确造成的。泄漏不是由于 JavaScript 代码本身,而是因为JS_Eval()
返回 a JSValue
,需要使用JS_FreeValue()
.
推荐阅读
- coldfusion - Testbox 2.1 - 跳过整个目录或 CFC 文件
- reactjs - 基本理解——React 应用中公共目录的位置
- angular - 如何在不需要 rxjs-compat 的情况下只导入 RxJS 6 中使用的运算符,如旧的 RxJS?
- javascript - 如何弄清楚请求是如何在网站中发起的?
- android - 使用 Android Studio 3.1 开发 AOSP 无法为检测测试构建测试 apk
- linux - 如何在 shell 脚本中参数化 git URL?
- angular - ngx数据表根本不呈现
- css - HTML 选项标签中的多种颜色(组合框)
- java - 问题在我的 Java 应用程序上不断重复
- ocaml - 无需使用附加即可取消组合序列的功能