Kiedy GC Lua pamięć przydzielona w Ckasowania pamięci przydzielone z lua_newuserdata
void *lua_newuserdata (lua_State *L, size_t size);
? Kiedy nie ma już odwołania w Lua, czy muszę go usunąć?
Kiedy GC Lua pamięć przydzielona w Ckasowania pamięci przydzielone z lua_newuserdata
void *lua_newuserdata (lua_State *L, size_t size);
? Kiedy nie ma już odwołania w Lua, czy muszę go usunąć?
Pamięć przydzielona z lua_newuserdata
jest zwalniana, gdy nie ma żadnych odniesień do niej wewnątrz Lua. Tak działa garbage collection. Istnieją ważne konsekwencje:
Nie ma potrzeby, aby zwolnić pamięć, że w programie C. Nie musisz się w ogóle martwić uwolnieniem.
Nie zwalniaj tej pamięci.
Nie przechowuj wskaźnika do tej pamięci w programie C i zakładaj, że jest on ważny na zawsze.
Jeśli chcesz użyć tego wskaźnika, upewnij się, że istnieje odniesienie do niego w Lua.
Innymi słowy, po wywołaniu lua_newuserdata
trzeba przechowywać tę wartość userdata gdzieś w Lua (zmiennej globalnej, wpis stół, upvalue funkcja), jeśli masz zamiar go użyć później w programie C . W przeciwnym razie może zniknąć po powrocie do Lua.
Lua rzeczywiście przydziela pamięć, ale nie daje prawa własności do tej przydzielonej pamięci. Tak więc krótka odpowiedź brzmi: nie, nie zwalniaj pamięci przydzielonej przez Luę.
lua_newuserdata
przydziela pamięć, ale nie daje jej własności C. Możesz go używać, jak uważasz, ale nie powinien go uwolnić; zostanie ona automatycznie zwolniona przez lua, gdy nie będzie już żadnych odwołań do obiektu userdata.
Następstwem tego jest to, że jeśli przez dłuższy czas utrzymuje się w nim wskaźnik, należy uważać, aby Lua go nie zbierała, dopóki nadal go używasz. Upewnij się, że nie usuniesz wszystkich odwołań Lua do danych użytkownika, dopóki nie użyjesz go z C - lub odwrotnie, użyj metametodu __gc
, aby upewnić się, że C otrzyma informację o zebraniu obiektu.
Nie sądzę, że istnieje coś takiego jak zbieranie śmieci w C, ale nie znam lua na tyle, aby wiedzieć, co dzieje się z tym, co on robi. – Eregrith