我试图找到一种方法来防止我的字符串被gc收集。我使用的是一个小结构,并使用下面的代码填充它。理想情况下,表本身将移动到ffi结构但我还没有(我怀疑那时我的所有结构都将被gc编辑)。我可以使用静态大小来解决,但考虑到我可能转移到ffi的记录和其他类似结构的数量,这将浪费大量RAM。
local ffi = require("ffi")
ffi.cdef[[
typedef struct {
uint8_t ctype;
uint16_t freq;
char* name;
char* icao;
} s_frq;
]]
local s_frq = ffi.typeof("s_frq")
[...]
local frq = s_frq()
frq.ctype = tonumber(fields[1])
frq.freq = freq
frq.icao = ffi.new("char[?]", #icao+1, icao)
frq.name = ffi.new("char[?]", #name+1, name)
db_apt[icao].freqs[#db_apt[icao].freqs+1] = frq
我在某处读过:
后者。 GC不遵循指针。仅来自的参考 考虑局部变量,upvalues,Lua表等。这也是 表示您不能存储对分配的对象的唯一引用 使用ffi.new()作为struct字段中的指针。
然后我无法弄清楚我应该在哪里存储我的指针。创建一个lua表来将它们与我的ffi struc并排存储会破坏不使用大型lua表的目的(因为主机应用程序 - X-Plane - 如果接收到大于32MB的alloc请求将崩溃)。