Назначить ссылку на объект переменной - PullRequest
0 голосов
/ 17 августа 2011

У меня есть вопрос о назначении здесь, я хочу знать

  1. делает ли Assign копию всего объекта и
  2. Я хотел бы знать, FTEA.Objects[0]* также освобожден.

Я хочу сделать копию FTEA.Objects[0], и когда я освобождаю ObjCur, я не собираюсь освобождать FTEA.Objects[0] - не уверен, что правильный способ сделать это, нужна ваша помощьСпасибо:

function xxxxxxxxxxxxxxxxxxxxxxxx
var 
  curQuo, tempQuo:TXX_TEA;
begin
  curQuo :=TXX_TEA(FTEA.Objects[0]);
  if xxxxxxxxx then
  begin
    tempQuo := TXX_TEA.Create();
    tempQuo.Assign(curQuo);   // Question 1: Assign copy the whole object value or not
    objCur.AddQuo(tempQuo)
  end
  else
    TXX_TEA(objCur.Quos[0]).Assign(curQuo);
  end;

  finally
    objCur.Free; // Question 2: FTEA.Objects[0] is freed or not
  end;
end

Ответы [ 2 ]

5 голосов
/ 17 августа 2011

Нет, освобождение одного объекта, который был назначен от другого объекта, не освобождает исходный объект.

То, как Assign будет функционировать, полностью зависит от класса. Каждый класс должен реализовывать Assign, а затем вызывать наследуемый и назначать свои собственные пользовательские свойства от источника к месту назначения, если классы совместимы. Я бы порекомендовал посмотреть на источник этих классов, чтобы проверить, реализуют ли они Assign.

3 голосов
/ 17 августа 2011

Назначение - это процедура, которая должна быть реализована для каждого класса, поэтому она выполняет то, для чего она запрограммирована. предполагается , чтобы попытаться скопировать весь объект, который передается в качестве аргумента, так, как это возможно.Но если это невозможно, то, вероятно, не должно ничего копировать.

Некоторые классы могут иметь реализации, которые не соответствуют этому неисполненному «контракту» и копируют только те части, которые им необходимы.Другими словами, то, что копируется, полностью зависит от реализации.

Назначение не имеет особого значения и является обычной функцией, а не какой-то магией компилятора.Он ничего не делает с объектом, переданным в качестве параметра, поэтому освобождение одного объекта не влияет на другой.Объекты полностью независимы.

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

...