-1

我有一个关于assign here的问题,我想知道

  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
4

2 回答 2

5

不,从另一个对象中释放一个已分配的对象不会释放源对象。

分配的功能完全取决于类。如果类兼容,每个类都必须实现分配,然后调用继承并将其自己的自定义属性从源分配到目标。我建议查看这些类的源代码以检查它们是否实现了分配。

于 2011-08-17T15:06:05.927 回答
3

分配是一个必须在每个类中实现的例程,因此它会按照它的程序进行操作。它应该尽可能地复制作为参数传递的整个对象。但如果它不能,它可能不应该复制任何东西。

某些类的实现可能不符合该未强制执行的“合同”,并且只复制他们需要的部分。换句话说,复制的内容完全取决于实现。

赋值没有特殊含义,是一个正常的函数,而不是某种编译器魔法。它不会对作为参数传递的对象做任何事情,因此释放一个对象不会影响另一个对象。对象是完全独立的。

请注意,并非所有类都实现了分配。您可能认为您为该类调用了Assign,但它实际上可能是继承的Assign,它对要复制的派生类中的任何新成员一无所知。分配的概念很好,但不幸的是,它通常没有实现或没有正确实现。

于 2011-08-17T19:11:42.143 回答