我需要编写一个测试来诊断使用 ffi.new 创建的 Lua 对象的双重释放。 结果,你需要调用两次collectgarbage(),之后就会出现双重释放的情况。
我写了这个例子:
local ffi = require("ffi")
ffi.cdef[[
typedef struct {
int x;
} my_struct;
]]
local obj = ffi.new("my_struct", {10})
obj = ffi.gc(obj, function (o)
print(123)
end)
obj = nil
collectgarbage("collect")
collectgarbage("collect")
但是这个对象的析构函数只被调用了1次
在 LuaJIT 中不可能对自动管理的内存调用双重释放。
但您可以手动管理内存:
local ffi = require"ffi"
ffi.cdef[[
typedef struct {
int x;
} my_struct;
void* malloc(size_t);
void free(void*);
]]
local function my_free(o)
print(123)
ffi.C.free(o)
end
local obj = ffi.gc(
ffi.cast("my_struct*", ffi.C.malloc(ffi.sizeof("my_struct"))),
my_free
)
my_free(obj) -- first free
obj = nil
collectgarbage("collect") -- second free