为变量分配对象引用

时间:2011-08-17 15:02:15

标签: delphi object reference free assign

我有一个关于在这里分配的问题,我想知道

  1. Assign是否复制整个对象和
  2. 我想知道FTEA.Objects[0]是否也被释放了。
  3. 我想制作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 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

Assign是一个必须按类实现的例程,因此它执行的是编程执行的操作。 假设试图复制作为参数传递的整个对象,以及它可以。但如果它不能,它可能不应该复制任何东西。

某些类可能具有不符合未强制“合同”的实现,只能复制所需的部分。换句话说,复制的内容完全取决于实现。

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

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