我在QuickJS JavaScript引擎中遇到了一个bug。我已经提交了一个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()
返回了一个JSValue
,需要使用JS_FreeValue()
释放它。