この記事は、numbers、bools、nil 以外のすべての型がガベージ コレクションされることを意味します。
フィールド gc は、ガベージ コレクションの対象となるその他の値 (文字列、テーブル、関数、大量のユーザー データ、およびスレッド) に使用されます。
これは、特定の状況下で、これらの非 gc 型を過剰に使用するとメモリ リークが発生する可能性があることを意味しますか?
この記事は、numbers、bools、nil 以外のすべての型がガベージ コレクションされることを意味します。
フィールド gc は、ガベージ コレクションの対象となるその他の値 (文字列、テーブル、関数、大量のユーザー データ、およびスレッド) に使用されます。
これは、特定の状況下で、これらの非 gc 型を過剰に使用するとメモリ リークが発生する可能性があることを意味しますか?
Lua では、実際には 2 種類の型があります。常に値渡しされる型と参照渡しされる型です ( Lua マニュアルの 2.1 章に従って)。
あなたが引用したものはすべて「値渡し」タイプであるため、変数に直接格納されます。変数を削除すると、値はすぐになくなります。
したがって、もちろん、新しい値を含む新しい変数を生成し続けない限り、メモリ リークが始まることはありません。しかし、その場合、それはあなた自身のせいです;)。
あなたがリンクした記事では、値がどのように表現されるかを示す C コードを書き留めています。
/*You can also find this in lobject.h in the Lua source*/
/*I paraphrased a bit to remove some macro magic*/
/*unions in C store one of the values at a time*/
union Value {
GCObject *gc; /* collectable objects */
void *p; /* light userdata */
int b; /* booleans */
lua_CFunction f; /* light C functions */
numfield /* numbers */
};
typedef union Value Value;
/*the _tt tagtells what kind of value is actually stored in the union*/
struct lua_TObject {
int _tt;
Value value_;
};
ここでわかるように、ブール値と数値は TObject 構造体に直接格納されます。それらは「ヒープ割り当て」されていないため、決して「リーク」できないことを意味し、したがってそれらをガベージ コレクションしても意味がありません。
ただし、注目すべき興味深い点の 1 つは、ガベージ コレクターは、C 側のもの (ユーザーデータおよび CC 関数) に対して作成された参照を収集しないことです。これらは C 側から手動で管理する必要がありますが、その場合は Lua ではなく C を記述しているため、これは当然のことです。