При использовании 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;
Помните, что если у вас есть несколько ссылок на один и тот же массив, вам нужно сделать это для всех ссылок на этот массив.