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