C LuaJIT指针和垃圾收集

C LuaJIT指针和垃圾收集,c,pointers,lua,garbage-collection,luajit,C,Pointers,Lua,Garbage Collection,Luajit,我试图完全理解LuaJIT的垃圾收集器将如何处理FFI,以及我必须手动管理的内容,因此我确信不会发生泄漏 阅读有关垃圾收集器的文章,以下断言是否正确: 如果使用ffi.new('float[?]”,n)分配数组,那么gc可以跟踪其引用并根据需要进行收集 使用ffi.malloc(sizeof('float[n]'))必须手动处理,如ffi.free或提供“终结器”,如local p=ffi.gc(ffi.malloc(sizeof('float[n]')),ffi.free) 如果加载了ffi.

我试图完全理解LuaJIT的垃圾收集器将如何处理FFI,以及我必须手动管理的内容,因此我确信不会发生泄漏

阅读有关垃圾收集器的文章,以下断言是否正确:

  • 如果使用
    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*示例(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)

    迈克·帕尔是什么意思

    “但即使编译了函数[ffi.gc()],gc也会 最终不得不打电话给终结者,这代价很高。”


    在本例中,他是否只是指对
    ffi.free
    的函数调用?如果是这样的话,
    ffi.new
    将如何规避这一开销?

    1-是,2-是,3-是,4-不完全正确
    ffi.gc(some\u cdata,user\u func)
    在上次引用消失时只调用
    user\u func(some\u cdata)
    。您可以使用此选项自动释放内存。或者根据您的函数进行其他操作。任何用户函数调用都是昂贵的。@EgorSkriptunoff谢谢您的回答。我以为这已经死了。不管怎样,按照第(4)条的方式思考似乎没有危险,对吗?例如,
    函数New_Array(size)local ptr=ffi.cast('float*',ffi.malloc(ffi.sizeof(float)*size))返回ffi.gc(ptr,ffi.free)end
    可以隐藏所有内容,最终用户会认为Lua是一种与Python类似的带有数组的动态语言(当然,在malloc保留陈旧数据时,这会有一些奇怪的行为,但是在没有
    new()消除C命名空间中未缓存的函数的开销?或者,您知道ffi.gc是否如Mike Pall多年前在我的问题中的链接中所说的那样在最新的LuaJIT版本中编译?使用
    ffi.C.malloc
    而不是本机优化的
    ffi.new
    ,关于
    ffi.gc的好处是什么e> JIT编译了吗?你最好问问迈克。