C++、lua 5.1、luabind 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 オブジェクトを正しく作成し、その所有権を取得するにはどうすればよいですか?