我正在努力完全理解LuaJIT的垃圾收集器将使用FFI处理什么以及我必须手动管理什么,所以我肯定不会泄漏。
关于垃圾收集器阅读LuaJIT FFI Semantics Docs以下断言是真的吗?:
ffi.new('float[?]',n)
分配数组,那么gc可以跟踪其引用并在必要时收集吗?ffi.malloc(sizeof('float[n]'))
,例如ffi.free或提供"终结器"例如local p = ffi.gc(ffi.malloc(sizeof('float[n]')), ffi.free)
?如果使用ffi.load加载的库包含函数float * example(void);
并且库已加载到名称空间Ex
中,则在
local ptr=Ex.example()
ptr
存储指针,当没有对ptr的引用时,gc会
收集ptr
并且记忆会被泄露?
ffi.gc(ptr, ffi.free)
让垃圾收集器知道ptr确实是一个指针,当ptr本身没有引用时,它指向的内存可以回收吗?
C函数返回的内存区域(例如来自malloc())必须是 当然是手动管理(或使用ffi.gc())。指向cdata的指针 对象与C函数返回的指针无法区分 (这是GC不能遵循它们的原因之一)。
这是否意味着即使C库函数的命名空间被赋予FFI,也知道返回值是指针,垃圾收集不能自动执行(4)?
Mike Pall是什么意思when he says
"但即使编译了该函数[ffi.gc()] ...... GC也会 必须最终调用终结器,这是昂贵的。"
他只是指在这种情况下对ffi.free
的函数调用?如果是这样,ffi.new
将如何解决这个开销?