Динамические массивы Delphi - это управляемые типы, которые имеют автоматическое управление временем жизни. Они подсчитывают ссылки, и когда счетчик ссылок становится равным 0, они удаляются. Вы можете считать их эквивалентными в отношении строк, интерфейсов и вариантов.
Вы можете явно освободить ссылку на динамический массив одним из трех способов:
a := nil;
Finalize(a);
SetLength(a, 0);
Однако очень часто просто ничего не делать и позволить освобождать ссылку, когда переменная выходит из области видимости.
Одна вещь, на которую следует обращать внимание при использовании динамических массивов, - это когда у вас есть две ссылки на один и тот же динамический массив. В этой ситуации изменения, примененные через одну ссылку, видны из другой ссылки, поскольку существует только один объект.
SetLength(a, 1);
a[0] := 42;
b := a;
b[0] := 666;//now a[0]=666
Вы спрашиваете, верно ли это:
Move(p^, FData, n);
Нет, это не так. Что вы сделали здесь, так это скопировали содержимое p
на ссылку FData
. Если вы хотите скопировать с Move
, вы можете написать:
Move(p^, Pointer(FData)^, n);
Или, если вы предпочитаете быть более многословным и избегать броска, вы можете написать:
if n>0 then
Move(p^, FData[0], n);
Лично я не чувствую себя слишком плохо из-за актерского состава, так как Move
в любом случае не имеет абсолютно никакой безопасности типов.
Было бы законно повторно использовать FData сейчас? Возможно, копируя в него новые (разные) данные?
Не думаю, что смогу ответить на этот вопрос без дополнительного контекста. Например, я не знаю, почему FData
является полем, поскольку оно используется только локально для этой функции. Это будет иметь больше смысла в качестве локальной переменной. Предположительно, есть причина, по которой он объявлен как поле, но его трудно определить из этого кода.
Вы об использовании шаблона производитель / потребитель. Обычно это делается для того, чтобы отделить производство от потребления. Однако ваш пример кода не делает этого, вероятно, потому что разделенный код будет слишком сложным, чтобы включать его здесь.
Для реализации настоящего производителя / потребителя необходимо передать право собственности на данные от производителя к потребителю. Из того, что мы описали выше, очень простой и эффективный способ сделать это - использовать подсчет ссылок. Когда данные передаются потребителю, производитель должен опубликовать ссылку на них.