14

最近、SetLength を使用してバイト配列にメモリを割り当てるコードを見ていましたが、そのメモリ空間を解放するロジックは見当たりませんでした。バイト配列の場合、値を nil に設定するか、Finalize を使用する必要があることを読みましたか?

これを処理する最善の方法は何ですか...私が見つけたものに基づいて、次のようなことが示唆されています...

var
  x: array of byte;
begin
  SetLength(x, 30);
  // Do something here
  :
  // Release the array
  x := nil;
  Finalize(x);
end;
4

2 に答える 2

26

通常、メモリを解放する必要はまったくありません。これは、識別子 (この場合はx) がスコープ外になると自動的に行われるためです。したがって、コードの最後の 2 行はまったく意味がありません。

ただし、たとえばプログラムが終了するまでスコープ外に出ない識別子がある場合は、それに関連付けられているメモリを手動で解放することをお勧めします。特に、識別子が大きなビットマップ イメージなどである場合は、これを実行する必要があります。x := nil次に、SetLength(x, 0)またはそのようなことを行うことができます。

于 2012-05-18T16:15:04.477 に答える
15

動的配列はマネージド型です。これは、配列への最後の参照が範囲外になると、コンパイラがメモリを破棄することを意味します。つまり、コード内の配列を解放するコードは無意味です。

必要に応じて、次の同等のコード行のいずれかを使用して、事前に配列の割り当てを解除できます。

SetLength(x, 0);
Finalize(x);
x := nil;

同じ配列への参照が複数ある場合は、その配列へのすべての参照に対してこれを行う必要があることに注意してください。

于 2012-05-18T16:19:05.347 に答える