开始涉足LuaJIT FFI并遇到了一个奇怪的问题。我有以下代码:
local ffi = require("ffi")
ffi.cdef [[
int decode(char* encodedToken, char** payload);
]]
local lib = ffi.load("lib.so")
local function decode(encoded_token)
local c_encoded_token = ffi.new("char[?]", #encoded_token, encoded_token)
local c_token = ffi.new("char*[1]")
lib.decode(c_encoded_token, c_token)
local resonse = ffi.string(c_token[0])
return response
end
基本上,共享库具有一种解码传入令牌的方法,并将输出写入char** payload
。奇怪的是,当我运行decode
函数的单个迭代时,此代码有效,但是当循环运行时,会导致Segmentation fault
。
这使我相信ffi.new("char*[1]")
分配存在内存泄漏。我什至尝试将其包装在一个ffi.gc
调用中,但也无济于事:
local c_token = ffi.gc(ffi.new("char*[1]"), ffi.free)
-- do stuff
c_token = nil
这是我第一次尝试FFI,因此任何指针都值得赞赏!
答案 0 :(得分:1)
自己弄清楚。显然是由于以空终止的C字符串占用了另外一个字符。
这有效:
local c_encoded_token = ffi.new("char[?]", #encoded_token + 1, encoded_token)