LuaJIT ffi 中的用户数据从 C 函数按值返回时是否会被垃圾回收?

问题描述 投票:0回答:1

我正在尝试弄清楚涉及 FFI 时的 LuaJIT 垃圾回收。假设我有一个按值返回

struct
的函数。

typedef struct MyTestData {
    int id;
    // ... other fields that may need finalizing/freeing
} MyTestData;

MyTestData createTestData(int id);
void deleteTestData(MyTestData data); // finalizes/frees the data in MyTestData fields

// and then I use the same in ffi.cdef and
local lib = ffi.load(LIBRARY_PATH)

我的问题是:

  1. 当我通过调用
    local v = lib.createTestData(25)
    创建一个 Lua 变量,然后
    v
    被垃圾收集(例如,在没有其他引用的情况下超出分数)时,它是否会释放为其分配的内存,即使
    createTestData
    返回结构值,而不是指向它的指针?
  2. 如果我需要额外清理资源,
    MyTestData
    可能会保留,并且我像这样创建它:
    local v = ffi.gc(lib.createTestData(25), lib.deleteTestData)
    ,当调用
    v
    后超出范围时,它是否也会自动释放
    deleteTestData
    使用的内存?

我问这个问题是因为 LuaJIT FFI 文档和示例通常处理指针、

malloc
free
,而就我而言,我拥有的是值。

c lua ffi luajit
1个回答
0
投票

不适合寄存器的参数(x64 长度超过 16 字节)由调用者预先分配并通过指针传递。也就是说,

struct foo bar(baz);
struct foo* bar(struct foo*, baz);

几乎相同

或者,从 ffi 的 POV 来看,

local foo = bar(baz)
变为
local foo = ffi.new(...); bar(foo, baz)
。所以不需要额外的预防措施。

© www.soinside.com 2019 - 2024. All rights reserved.