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