4

この記事は、numbers、bools、nil 以外のすべての型がガベージ コレクションされることを意味します。

フィールド gc は、ガベージ コレクションの対象となるその他の値 (文字列、テーブル、関数、大量のユーザー データ、およびスレッド) に使用されます。

これは、特定の状況下で、これらの非 gc 型を過剰に使用するとメモリ リークが発生する可能性があることを意味しますか?

4

2 に答える 2

2

Lua では、実際には 2 種類の型があります。常に値渡しされる型と参照渡しされる型です ( Lua マニュアルの 2.1 章に従って)。

あなたが引用したものはすべて「値渡し」タイプであるため、変数に直接格納されます。変数を削除すると、値はすぐになくなります。

したがって、もちろん、新しい値を含む新しい変数を生成し続けない限り、メモリ リークが始まることはありません。しかし、その場合、それはあなた自身のせいです;)。

于 2013-03-07T09:10:43.410 に答える
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 を記述しているため、これは当然のことです。

于 2013-03-07T15:46:51.487 に答える