2013-10-18 13 views
5

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ąć?

+0

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

Odpowiedz

6

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:

  1. Nie ma potrzeby, aby zwolnić pamięć, że w programie C. Nie musisz się w ogóle martwić uwolnieniem.

  2. Nie zwalniaj tej pamięci.

  3. Nie przechowuj wskaźnika do tej pamięci w programie C i zakładaj, że jest on ważny na zawsze.

  4. 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.

2

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ę.

7

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.

Powiązane problemy