首页 > 解决方案 > 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 的类似问题?

标签: quickjs

解决方案


对于将来可能偶然发现此问题的任何人,这是由于 API 使用不正确造成的。泄漏不是由于 JavaScript 代码本身,而是因为JS_Eval()返回 a JSValue,需要使用JS_FreeValue().


推荐阅读