При использовании 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;

2 ответов


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

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


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

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

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

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