4

ユーザーデータ オブジェクトを作成してテーブルに格納した場合、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ここで軽いユーザーデータを使用したほうがよいでしょうか?

4

2 に答える 2

3

テーブル (またはテーブル要素) がどこでも使用されておらず、安全に削除できると Lua ガベージ コレクターが判断するまで有効です。メタメソッドを使用して、Lua はガベージ コレクションが発生したときに通知します。

http://pgl.yoyo.org/luai/i/lua_newuserdata

https://www.lua.org/pil/29.html

于 2016-08-02T11:56:04.683 に答える