Wenn ich ein Userdata-Objekt erstellen und es in einer Tabelle speichern, dann erhalten Sie einen Verweis auf es in C/C++, für wie lange ist diese Referenz gültig? Ist der Verweis in C/C++ garantiert gültig, solange die Benutzerdaten in der Tabelle in Lua gespeichert sind? Oder besteht die Gefahr, dass die Lua-Laufzeitumgebung das Userdata-Objekt verschiebt, wodurch die C/C++ - Referenz ungültig wird?Lebensdauer von Lua userdata Zeigern
Hier ist, was ich tue:
// Initially, the stack contains a table
class Foo { ... };
lua_pushstring(L, "my_userdata");
void* mem = lua_newuserdata(L, sizeof(Foo));
new (mem) Foo();
lua_settable(L, -3);
// Later:
lua_pushstring(L, "my_userdata");
lua_gettable(L, -2);
Foo *foo = (Foo*)lua_touserdata(L, -1);
lua_pop(L, 1);
// How long will this pointer be valid?
Bin ich besser dran operator new
und ein Licht-Userdaten mit hier?
Danke, große Antwort.Gibt es ein Problem damit, stattdessen 'void * men = lua_newuserdata (L, sizeof (Foo)) zu sagen; Foo * f = neu (Männer) Foo(); '? – Tom
@tom das Problem ist, wer wird 'löschen' anrufen? Es gibt zwei unterschiedliche Lebenszeiten; die userdata (verwaltet mit C's 'realloc') und das C++ Objekt (verwaltet mit' new'/'delete'). Bei einer Platzierung "neu" wird die Erinnerung geteilt, Lua wird sie glücklich sammeln und Sie werden ein undefiniertes Verhalten haben. Das Pointer-zu-Pointer-Idiom ermöglicht die Koexistenz beider Lebensdauern. Lua verwaltet seinen Speicher mit 'realloc' und in einem' __gc' Metamethode können Sie 'delete' auf Ihrem C++ Objekt aufrufen. – Adam
Sie könnten den Destruktor manuell in der Metamethode '__gc' aufrufen. Das ist sowieso normal, wenn Sie Placement neu verwenden ... – siffiejoe