1

これは私の問題であるため、すべてのユーザーデータ「テーブル」(ユーザーデータテーブルと呼ばれますか?)にアクセスしてLuaから削除できるかどうか疑問に思っています:

a = Object(5, 5)
a:Delete()
a:SetPosition(3,3)

ご覧のとおり、最初にオブジェクトを作成し、マップ クラスで "new" を使用して割り当てられた Object という名前の C++ クラスへのポインターを保存します。次に、オブジェクトを削除します。つまり、マップ クラスのポインターに割り当てられたメモリを削除します。そして最後に SetPosition を呼び出します。メモリがまだ c++ オブジェクト クラスに割り当てられている場合は、すべてが楽しく実行されます。しかし、それが削除の場合 (この場合は SetPosition(...) 呼び出しの前に Delete() を呼び出したため)、私のプログラムはクラッシュします。だから私が疑問に思っているのは次のとおりです:

Delete を呼び出して、lua の変数 'a' を nil に設定することは可能ですか? Delete が nil を返す場合、「a = a:Delete()」のようなことができることはわかっていますが、「a =」の部分を忘れると失敗します。また、ユーザーデータを削除して、SetPositon() を呼び出すときに存在しないかどうかを確認することが可能かどうか疑問に思っています。そうでない場合は、単に戻ります。

また、基本コードはhttp://lua-users.org/wiki/SimpleCppBindingからのものです。

4

3 に答える 3

4

まず、あなたの質問に答えさせてください。

Deleteを呼び出して、luaの変数「a」をnilに設定することはできますか?

いいえ。あなたが言っていることをする手段はありません。そしてそれには理由があります:あなたがやろうとしているのはひどいコードです。

Luaはガベージコレクションシステムです。Luaがオブジェクトを削除することを期待すべきではありません。Luaが外部オブジェクトへのポインターを取得した場合、コードがそれを所有しているか、Luaがそれを所有しています。

コードがそれを所有している場合、Luaはそれを削除してはなりません。ルアはそれを一定期間使用することができます。しかし、それを正確にそしてその期間だけ使用するのはあなたのLuaコード次第です。その寿命が切れたら、ルアはもうそれと話しているべきではありません。

これは、CおよびC++でオブジェクトへのポインターを処理するのと同じです。関数にネイキッドポインター(つまり、スマートポインターではない)が渡された場合、コードは、そのオブジェクトとの通信を合理的に期待できる時間を知る必要があります。保管できますか?そのオブジェクトへのポインタをどのくらいの期間保存できますか?そのオブジェクトはいつ死ぬのでしょうか、そして誰がそれを破壊する責任がありますか?

Luaがオブジェクトを所有するようにオブジェクトをLuaに渡す場合、Luaがオブジェクトを明示的に削除することもできません。Luaはガベージコレクションシステムです。__gcユーザーデータが収集されたときにLuaのガベージコレクターがコードを呼び出すように、タイプにメタメソッドをアタッチする必要があります。そうすれば、デストラクタを呼び出したり、メモリを解放したりできます。

現在Luaに属しているものをLuaに与えると、通常のLuaオブジェクトのように見えるはずです。DeleteLuaで作成したテーブルや文字列のメソッドは呼び出さないでください。ガベージコレクターにその仕事を任せます。C ++からLuaへのインターフェースを作成するのはあなたの仕事であり、Luaに提供するオブジェクトがLuaが望むように動作することを保証します。

重要なリソース管理を行う必要がある場合、Luaにリソースをできるだけ早く解放させたい場合(ファイルハンドルなど)、C++オブジェクトへのポインターを非ライトユーザーデータに格納する必要があります。それはあなたがNULLにするポインタです。そのオブジェクトのすべてのインターフェイス関数は、ポインタをチェックしてNULLかどうかを確認し、何もしないかエラーを発生させます。

Luaのファイルハンドル(によって返されるio.open)は、この良い例です。それらの関数を呼び出そうとすると、LuaはLuaエラーをスローします。

于 2012-02-06T22:53:27.677 に答える
3

Deleteメソッドで、受信したオブジェクトのメタテーブルを に設定するとnil、後でそのオブジェクトのメソッドを呼び出すとエラー メッセージが表示されます。

于 2012-02-06T22:59:11.903 に答える
1

I'd rather advice using SWIG or LuaBind instead, they've already taken care of such pitfalls for you.

于 2012-02-06T22:51:46.867 に答える