ユーザーデータ オブジェクトを作成してテーブルに格納した場合、C/C++ でそれへの参照を取得します。その参照はどのくらいの期間有効ですか? ユーザーデータがLuaのテーブルに保持されている限り、C/C++での参照は有効であることが保証されていますか? または、Lua ランタイムがユーザーデータ オブジェクトを移動し、それに対する C/C++ 参照を無効にするリスクはありますか?
これが私がやっていることです:
// 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?
operator new
ここで軽いユーザーデータを使用したほうがよいでしょうか?