删除使用lua_newuserdata分配的内存

Obj*_*ive 5 c memory lua garbage-collection

什么时候用C语言分配Lua gc内存

void *lua_newuserdata (lua_State *L, size_t size);
Run Code Online (Sandbox Code Playgroud)

?当Lua中没有任何引用指向它时,或者我是否必须小心删除它?

Tox*_*rog 7

lua_newuserdata分配内存但不给它C所有权.您可以根据需要使用它,但不应该释放它; 一旦没有对userdata对象的引用,它将被lua自动释放.

这样做的必然结果是,如果你在C中长时间保持它的指针,你必须要小心Lua在你还在使用时不会收集它.确保在完成从C语言中使用它之前不要删除对userdata的所有Lua引用 - 或者相反,使用__gcmetamethod确保在收集对象时通知C.


lhf*_*lhf 6

分配的内存 Lua 内部lua_newuserdata没有引用时被释放.这就是垃圾收集的工作原理.有重要的后果:

  1. 无需在C程序中释放该内存.根本不用担心释放它.

  2. 不要释放那段记忆.

  3. 不要在C程序中存储指向该内存的指针,并假设它永远有效.

  4. 如果要使用该指针,请确保在Lua中有对它的引用.

换句话说,在调用之后lua_newuserdata,如果您将在以后的C程序中使用它,则需要将该userdata值存储在Lua中的某个位置(全局变量,表条目,函数upvalue).否则它会在你回到Lua后消失.