删除使用lua_newuserdata分配的内存

时间:2013-10-18 14:55:01

标签: c memory lua garbage-collection

什么时候用C

分配Lua gc内存
void *lua_newuserdata (lua_State *L, size_t size);

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

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

当> Lua中没有对的引用时,将释放分配了lua_newuserdata的内存。这就是垃圾收集的工作原理。有重要的后果:

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

  2. 不要释放那段记忆。

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

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

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

答案 2 :(得分:2)

Lua确实会分配内存但不会给你这个分配内存的所有权。所以简短的回答是:不,不要释放Lua分配的内存。