我在QuickJS JavaScript引擎中遇到了一个似乎是错误的东西。我已经提交了一个GitHub issue,但我也在这里询问是否可能是用户错误,和/或找出其他人是否遇到过类似的问题。
下面是测试代码:
#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的类似问题?
发布于 2021-05-30 03:41:43
对于将来可能会发现这一点的任何人来说,这是由于不正确的API使用造成的。泄漏不是由于JavaScript代码本身造成的,而是因为JS_Eval()返回了一个JSValue,需要使用JS_FreeValue()来释放它。
https://stackoverflow.com/questions/67712306
复制相似问题