5

私がこのようなクラスを持っているとしましょう:

class A
{
public:
A(){}
~A(){}
};

そして、次のようにLuabindを介してLuaに公開します。

module(luaState) 
    [
        class_<A>("Foo")
        .def(constructor<>())
    ];

そして最後に、次のようなスクリプトでインスタンス化します。

A = Foo();

その時点でのAの実際の「存在状態」は何ですか?

それはヒープのどこかにあり、luaはそれへの参照をどこかに保持していますか?(またはluabind :: object?)

newまたは同等のものによって割り当てられたように、それはポインタにしかなり得ないような気がします。

ただし、参照を受け入れる関数をluaにバインドすることはできます。たとえば、最終的にlua_doSomething(A & a)は実際の参照になります。確かに、これは非常にうまくいく可能性があることを私は知っていますが、それがどのaように行わ*aれるのかはわかりません。

私がこれを求めている理由は、スクリプトでインスタンス化されたオブジェクトの存続期間を少しでもよく理解して予測するためです。

それと、上記のようにクラスをluaに公開する代わりに、所有権や存続期間が変更されるかどうかわからない場合は、次のようにします。

A * lua_CreateA()
{
return new A();
}

module(luaState) 
    [
        class_<A>("Foo")
    ];


module(luaState)
    [

    def("createA",&lua_CreateA)

    ];

そしてそれを次のように使用する

A = createA();

これまでに理解したロジックでは、luabindのこのような割り当てがバインドされたコンストラクターで行うのと同じでない限り、私が新しいオブジェクトを割り当てるため、この場合はクリーンアップを行う必要があります。

要するに、私はオブジェクトの存続期間などについて本当に混乱しています...これに関連するキーワードをグーグルで検索しましたが、 http: //www.gamedev.net/topic/525692-luabindのようなものしか取得していません-所有権と破壊/

それは私が知りたいことではありません。割り当て、インスタンス化、ライフタイムなど、舞台裏で物事がどのように処理されるかを具体的に理解したいと思います。

4

1 に答える 1

5

Luabindを使用すると、オブジェクトの存続期間は非常に簡単です。Luabindがそれを取得するために内部で行うことの厄介な詳細を理解する必要はありません。

Luaは、Luaによって直接作成されたオブジェクトを所有しています。したがって、Luaでコンストラクター構文を使用してオブジェクトを割り当てる場合、そのオブジェクトはLuaが所有します。オブジェクトがLuaで参照されなくなると、LuaGCがオブジェクトを収集します。

Luaが他の方法でオブジェクトへの参照を取得した場合、Luabindの養子縁組ポリシーを使用して所有権を明確に譲渡しない限り、Luaはそのオブジェクトを所有しません。したがって、オブジェクトを返す関数をLuaにバインドしていて、そのオブジェクトがいつ生きているかどうかをLuaが決定することを期待している場合は、採用ポリシーを使用する必要があります。

最後の段落は、実際の参照(ポインタと参照型を返す)にのみ適用されます。Luaにオブジェクトのコピーが(非参照またはポインターの戻り値を介して)与えられた場合、Luaはそのオブジェクトのコピーを所有します。

于 2011-08-14T20:23:40.400 に答える