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がスコープ外になり、ヒープオブジェクトの参照カウントも減少するため、最後の呼び出しは完全に不要です。