我正在尝试弄清楚涉及 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)
我的问题是:
local v = lib.createTestData(25)
创建一个 Lua 变量,然后 v
被垃圾收集(例如,在没有其他引用的情况下超出分数)时,它是否会释放为其分配的内存,即使 createTestData
返回结构值,而不是指向它的指针?MyTestData
可能会保留,并且我像这样创建它:local v = ffi.gc(lib.createTestData(25), lib.deleteTestData)
,当调用v
后超出范围时,它是否也会自动释放deleteTestData
使用的内存?我问这个问题是因为 LuaJIT FFI 文档和示例通常处理指针、
malloc
和free
,而就我而言,我拥有的是值。
不适合寄存器的参数(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)
。所以不需要额外的预防措施。