2013-10-18 12 views
5

Wann Lua gc Speicher mitlöschen Speicher mit lua_newuserdata zugeordnet

in C zugeordnet
void *lua_newuserdata (lua_State *L, size_t size); 

? Wenn es keine Referenz in Lua mehr gibt oder muss ich darauf achten, es zu löschen?

+0

Ich glaube nicht, dass es so etwas wie Müllsammlung in C gibt, aber ich weiß nicht genug, um zu wissen, was mit dem passiert, was es verwaltet. – Eregrith

Antwort

6

Der mit lua_newuserdata zugewiesene Speicher wird freigegeben, wenn keine Referenzen darauf vorhanden sind innerhalb Lua. So funktioniert die Garbage Collection. Es gibt wichtige Konsequenzen:

  1. Keine Notwendigkeit, diesen Speicher in Ihrem C-Programm freizugeben. Kein Grund zur Sorge, es überhaupt zu befreien.

  2. Diesen Speicher nicht freigeben.

  3. Speichern Sie keinen Zeiger auf diesen Speicher in Ihrem C-Programm und nehmen Sie an, dass es für immer gültig ist.

  4. Wenn Sie diesen Zeiger verwenden möchten, vergewissern Sie sich, dass in Lua ein Verweis darauf steht.

Mit anderen Worten, nach lua_newuserdata Aufruf müssen Sie diesen Benutzerdaten Wert speichern irgendwo in Lua (eine globale Variable, einen Tabelleneintrag, eine Funktion aufzuwerten) wenn du gehst, um es später in Ihrem C-Programm . Andernfalls kann es nach Ihrer Rückkehr nach Lua verschwinden.

2

Lua reserviert tatsächlich Speicher, aber Sie erhalten nicht den Besitz dieses zugewiesenen Speichers. Die kurze Antwort lautet also: Nein, löse nicht den von Lua zugewiesenen Speicher.

7

lua_newuserdata reserviert Speicher, aber nicht C-Besitz von es. Sie können es verwenden, wie Sie es für richtig halten, aber sollten Sie es nicht freigeben; Es wird automatisch von lua freigegeben, sobald keine Referenzen mehr auf das Userdata-Objekt vorhanden sind.

Die logische Folge davon ist, dass, wenn Sie in C für eine lange Zeit Zeiger darauf halten, Sie darauf achten müssen, dass Lua es nicht sammelt, während Sie es noch verwenden. Stellen Sie sicher, dass Sie nicht alle Lua-Verweise auf die Benutzerdaten entfernen, bis Sie sie nicht mehr aus C verwenden. Verwenden Sie umgekehrt die Metamethode __gc, um sicherzustellen, dass C informiert wird, wenn das Objekt erfasst wird.

Verwandte Themen