6

什么时候在 C 中分配 Lua gc 内存

void *lua_newuserdata (lua_State *L, size_t size);

? 当 Lua 中不再有引用指向它时,还是我必须注意删除它?

4

3 回答 3

7

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

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

  2. 不要释放该内存。

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

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

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

于 2013-10-18T15:16:28.183 回答
7

lua_newuserdata分配内存,但不给 C 拥有它的所有权。您可以随意使用它,但不应释放它;一旦没有更多对 userdata 对象的引用,它将由 lua 自动释放。

对此的推论是,如果您在 C 中长时间保留指向它的指针,则必须小心 Lua 在您仍在使用它时不会收集它。确保在从 C 中使用完用户数据之前不要删除所有 Lua 对用户数据的引用 - 或者相反,使用__gc元方法确保在收集对象时通知 C。

于 2013-10-18T15:16:55.947 回答
2

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

于 2013-10-18T15:05:16.960 回答