Cで割り当てられたLua gcメモリはいつですか
void *lua_newuserdata (lua_State *L, size_t size);
? Lua にそれを指している参照がもうない場合、または削除に注意する必要がありますか?
Cで割り当てられたLua gcメモリはいつですか
void *lua_newuserdata (lua_State *L, size_t size);
? Lua にそれを指している参照がもうない場合、または削除に注意する必要がありますか?
で割り当てられたメモリは、 Lua内lua_newuserdata
で参照されていない場合に解放されます。これがガベージコレクションの仕組みです。重要な結果があります。
C プログラムでそのメモリを解放する必要はありません。解放について心配する必要はまったくありません。
そのメモリを解放しないでください。
そのメモリへのポインタを C プログラムに保存して、それが永久に有効であると想定しないでください。
そのポインターを使用したい場合は、Lua でそのポインターへの参照があることを確認してください。
つまり、呼び出しlua_newuserdata
た後、後で C プログラムで使用する場合は、その userdata 値を Lua (グローバル変数、テーブル エントリ、関数の上位値) のどこかに格納する必要があります。そうしないと、Lua に戻ったときに消えてしまう可能性があります。
lua_newuserdata
メモリを割り当てますが、その所有権を C に与えません。必要に応じて使用できますが、解放しないでください。userdata オブジェクトへの参照がなくなると、lua によって自動的に解放されます。
これに対する当然の帰結として、C で長い間ポインタを保持している場合は、まだ使用している間に Lua がそれを収集しないように注意する必要があります。C からの使用が完了するまで、ユーザーデータへのすべての Lua 参照を削除しないようにしてください。または、逆に、メタメソッドを使用して__gc
、オブジェクトが収集されたときに C に通知されるようにします。