Копировать на запись для массива записей


Применяется ли семантика копирования при записи для динамических массивов записей?

Как правильно дублировать массив записей?

Достаточно ли этого?:

type
  recordA = Record
    Y:integer;
  end;
var x: array of recordA;
    b: array of recordA;
    item: recordA;
begin
  SetLength(x, 2);
  item.Y:= 2;
  x[0] := item;
  item.Y:= 5;
  x[1] := item;
  //Copying
  b:= x;

После завершения копирования мне нужно будет сбросить первый массив:

SetLength(x, 0);

Могу ли я сделать это таким образом?

1 2

1 ответ:

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

Если вам нужно скопировать содержимое динамического массива, используйте функцию Copy. Вот пример, демонстрирующий разницу между назначением динамического массива и копированием:

procedure TestCopy;
type
  recordA = Record
    Y:integer;
  end;
  arrayA = array of recordA;

var x, b, c: arrayA;
    item: recordA;

begin
  SetLength(x, 2);
  item.Y:= 2;
  x[0] := item;
  item.Y:= 5;
  x[1] := item;

  b:= x;
  x[0].Y:= 4;
  Writeln(b[0].Y, ' -- ', x[0].Y);

  b:= Copy(x);
  x[0].Y:= 8;
  Writeln(b[0].Y, ' -- ', x[0].Y);
end;