6

Cで割り当てられたLua gcメモリはいつですか

void *lua_newuserdata (lua_State *L, size_t size);

? Lua にそれを指している参照がもうない場合、または削除に注意する必要がありますか?

4

3 に答える 3

7

で割り当てられたメモリは、 Lualua_newuserdataで参照されていない場合に解放されます。これがガベージコレクションの仕組みです。重要な結果があります。

  1. C プログラムでそのメモリを解放する必要はありません。解放について心配する必要はまったくありません。

  2. そのメモリを解放しないでください。

  3. そのメモリへのポインタを C プログラムに保存して、それが永久に有効であると想定しないでください。

  4. そのポインターを使用したい場合は、Lua でそのポインターへの参照があることを確認してください。

つまり、呼び出しlua_newuserdataた後、後で C プログラムで使用する場合は、その userdata 値を Lua (グローバル変数、テーブル エントリ、関数の上位値) のどこかに格納する必要があります。そうしないと、Lua に戻ったときに消えてしまう可能性があります。

于 2013-10-18T15:16:28.183 に答える
7

lua_newuserdataメモリを割り当てますが、その所有権を C に与えません。必要に応じて使用できますが、解放しないでください。userdata オブジェクトへの参照がなくなると、lua によって自動的に解放されます。

これに対する当然の帰結として、C で長い間ポインタを保持している場合は、まだ使用している間に Lua がそれを収集しないように注意する必要があります。C からの使用が完了するまで、ユーザーデータへのすべての Lua 参照を削除しないようにしてください。または、逆に、メタメソッドを使用して__gc、オブジェクトが収集されたときに C に通知されるようにします。

于 2013-10-18T15:16:55.947 に答える