2017-08-07 1 views
3

以下の例は、問題または疑問を示すためのものです。実際には私は を作成し、多くの異なるユーザデータオブジェクトを返す関数を持ち、それらのいくつかの間で私はLuaガベージコレクタを呼びたいかもしれません。lua_newuserdataも使用しているときに、C++でlua_gcを呼び出すことができるのはいつですか

また、WindowsとLinuxの両方で動作するLuaバージョン5.3.3を使用しています。簡単にするため、エラー処理は示されていません。

私はC++クラスを標準ユーザーデータを介してLuaに公開しています。 Roberto Ierusalimschyの "Programming in Lua" 私の問題は、Luaが自分のオブジェクトへの参照を持っているかどうか分からないため、 ガベージコレクタをC++ lua_gc関数経由で呼び出すことができるのはいつですか?

コンストラクタとデストラクタを持つ標準のFoo C++クラスです。 ReleaseFooと呼ばれる__gcエントリ関数を持つmetatable "FOO" も定義されています。私は、次のC++コードを介して、Luaのインスタンスを作成

:Luaの

static int NewFoo(lua_State* L) 
{ 
    Foo** foo; 
    foo = (Foo**) lua_newuserdata(L, sizeof(Foo**)); 
    *foo = new Foo(); 
    luaL_getmetatable(L, "FOO"); 
    lua_setmetatable(L, -2); 

    // QUESTION: Can I call lua_gc(L, LUA_GCCOLLECT, 0) here without 
    //   risking my user data object being garbage collected. 
    //   As I see it, Lua does not yet have a reference 
    //   to my user data object. 

    return 1; 
} 

static int ReleaseFoo(lua_State* L) 
{ 
    Foo* foo = *(Foo**)lua_touserdata(L,1); 
    if (foo) 
    { 
    delete foo; 
    foo = NULL; 
    } 
    return 0; 
} 

、それを使用することは、これだけC++関数NewFoo(L)の復帰後の基準が確立されている(ようになります。示したように、私は、ガベージコレクタを呼び出すことができます):?あなたのユーザデータオブジェクトへの参照が存在するので、

LUA> foo = NewFoo() 

答えて

3

lua_setmetatableは、スタックからオブジェクトを削除しません。だからルアはそれを集めません。

+0

ありがとう、あなたは正しくなければなりません。参照は、後でLua変数 "foo"に転送されるまでスタック上になければなりません。 –

関連する問題