При использовании SetLength() в Delphi, каков правильный способ освободить эту память?

Недавно я рассматривал некоторый код, который использует SetLength для выделения памяти для массива байтов, но я не видел никакой логики для освобождения этого пространства памяти. Я прочитал, что для массива байтов вы должны либо установить значение в nil, либо использовать Finalize?

Каков наилучший способ справиться с этим... Исходя из того, что я нашел, он предлагает что-то вроде следующего...

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

Ответ 1

Обычно вам не нужно освобождать память вообще, так как это делается автоматически, когда идентификатор (в данном случае, x) выходит за пределы области видимости. Следовательно, две последние строки в вашем коде совершенно бессмысленны.

Если, однако, у вас есть идентификатор, который не выходит за пределы области действия, пока, скажем, ваша программа не закрывается, вы можете освободить связанную с ней память вручную. В частности, вы можете сделать это, если идентификатор представляет собой большое изображение растрового изображения или что-то в этом роде. Тогда вы можете сделать x := nil, SetLength(x, 0) или что-то в этом роде.

Ответ 2

Динамические массивы управляются типами. Это означает, что компилятор избавится от памяти, когда последняя ссылка на массив выходит за рамки. Это означает, что код для освобождения массива в вашем коде довольно бессмыслен.

Если вам нужно, вы можете освободить массив раньше времени, используя любую из этих эквивалентных строк кода:

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

Помните, что если у вас есть несколько ссылок на один и тот же массив, вам нужно сделать это для всех ссылок на этот массив.