3

C++lua 5.1luabind 0.7-0.81を使用

親を持つ lua クラスを作成し、それを luabind::object に格納しようとしています。

ルア

class 'TestClassParent'
function TestClassParent:__init()
    print('parent init\n')
end
function TestClassParent:__finalize()
    print('parent finalize\n')
end

class 'TestClass' (TestClassParent)
function TestClass:__init()
    print('init\n')
    TestClassParent.__init(self)
end
function TestClass:__finalize()
    print('finalize\n')
end

C++

{
    luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass");
}
printf("before GC\n");
lua_gc(lua, LUA_GCCOLLECT, 0);
printf("after GC\n");

出力:
init
親 init
before GC
after GC

結果: obj が破棄された後、'TestClass' インスタンスはガベージ コレクション サイクル後も存続します (__finalize メソッドは呼び出されず、メモリは解放されません)。プログラムの終了時にのみ破棄されます。
さらに、親なしでクラスを使用すると、ガベージが正しく収集されます。

採用ポリシーを使用しようとすると(作成されたオブジェクトの所有権を取得するため)

luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass")[luabind::adopt(luabind::result)];

私は得る:

  • luabind 0.7 - ポリシーを採用しない場合と同じ結果
  • luabind 0.81 - 「登録されていないタイプを使用しようとしています」というメッセージが表示されてクラッシュ する

C++ で lua オブジェクトを正しく作成し、その所有権を取得するにはどうすればよいですか?

4

2 に答える 2

8

これは 0.8.1 の既知のバグです。最後に構築されたオブジェクトへの参照は、「スーパー」関数の upvalue に残されます。0.9-rc1 で修正されました。

http://github.com/luabind/luabind/commit/2c99f0475afea7c282c2e432499fd22aa17744e3

于 2009-12-22T13:40:21.843 に答える
1

編集:OPの更新後、この回答は関連性がなくなりましたが、ここにぶら下げておきます。Daniel Wallin さんが正解を投稿しました

本当の答えではありませんが、コメントで書式設定が失われます

これを再現することはできません。私が使用する正確なコードは次のとおりです。

// initialization
lua_State* lua = lua_open();
luaL_openlibs(lua);
luabind::open(lua);
// declare class
luaL_loadstring(lua, 
    "class 'TestClass'\
     function TestClass:__init() print('init') end\
     function TestClass:__finalize() print('finalize') end");
lua_pcall(lua, 0, LUA_MULTRET, 0);
// instantiate
{
    luabind::object obj = luabind::call_function<luabind::object>(lua, "TestClass");
}
// collect
printf("Before GC collect\n");
lua_gc(lua, LUA_GCCOLLECT, 0);
printf("After GC collect\n");
lua_close(lua);

そして、私が得る結果は次のとおりです。

init
Before GC collect
finalize
After GC collect

VC8(別名VS2005)SP1でlua 5.1.4、luabind 0.81を使用しています

于 2009-12-21T20:29:48.453 に答える