2

ローカルの動的配列の長さをゼロに設定すると (不要になった場合)、メモリ使用量にメリットがありますか?

例えば:

var
  MyArray : array of string;
begin
  <filling my array with a lot of items....>

  <doing some stuffs with MyArray>

  //from here on, MyArray is no more needed, should I set its length to zero?
  SetLength(MyArray, 0);

  <doing other stuffs which doesn't need MyArray...>
end;
4

2 に答える 2

6

Delphi では、動的配列は参照カウントされます。

したがって、

MyArray := nil;

また

Finalize(MyArray);

また

SetLength(MyArray, 0);

変数MyArrayは動的配列ヒープ オブジェクトをポイントしなくなるため、その参照カウントは 1 減ります。これにより参照カウントが 0 になると、変数がそれをポイントしないことを意味し、解放されます。

例 1

だから

var
  a: array of Integer;
begin

  SetLength(a, 1024*1024);

  // ...

  SetLength(a, 0);

  // ...

end

がこのヒープ オブジェクトを指す唯一の変数であると仮定しSetLength(a, 0)て、のメモリを解放します。a

例 2

var
  b: TArray<Integer>;

procedure Test;
var
  a: TArray<Integer>;
begin

  SetLength(a, 1024*1024);

  b := a;

  SetLength(a, 0);

  // ...

end

SetLength(a, 0)まだ元の配列を参照しているため、メモリは解放されませんbただし、参照カウントは 2 から 1 に減ります。

例 3

そしてもちろん、

var
  a: array of Integer;
begin

  SetLength(a, 1024*1024);

  // ...

  SetLength(a, 0);

end

SetLengthいずれにせよ、コードの次の行でローカル変数aがスコープ外になり、ヒープオブジェクトの参照カウントも減少するため、最後の呼び出しは完全に不要です。

于 2020-11-20T10:22:57.977 に答える