分配一个对象引用变量

问题描述:

我有一个问题关于分配在这里,我想知道分配一个对象引用变量

  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 
+0

Downvoted for useless question。 –

+0

@spspli:我同意@Warren(虽然我没有downvote)。尝试发布使用诸如“函数xxxxxxxxxxxxxxxxxxxxxxxx”和“if xxxxxxx”和“TXX_TEA”之类的代码的示例代码会使其难以阅读和理解。发布您的实际代码(仅进行必要的更改以实现隐私等等)。发布无用的示例代码使得难以给你有用的答案。 –

赋值是每个类必须实现的例程,因此它可以完成它所编程的任务。它是假设尝试复制作为参数传递的整个对象,以及它可以。但如果它不能,它可能不应该复制任何东西。

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

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

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

+0

我检查了代码,分配正确执行,它分配了每个属性。谢谢你的答案.FTEA.Objects [0]在这里没有释放。 – spspli

+0

很高兴知道它实现了正确分配。在第三方代码中,IME并非总是如此。 –

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

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

+0

我检查他们实现分配和分配每个属性从源到类对象。所以tempQuo.Assign(curQuo)你认为它会将curQuo对象的每个属性指向tempQuo对象? – spspli

+7

Spspli,而不是问什么一群陌生人他们认为*会发生什么,为什么不直接运行你的代码和*看看*属性是否被复制到新对象?你已经被告知应该发生什么,所以检查一下。这是编程,而不是哲学。 –

+0

@Rob:+1为“编程,而不是哲学”。当我看到两个程序员在工作时,总是会在我的工作中争论X在程序中做X会产生效果Y还是产生Z.有时我会厌倦并告诉他们:“运行它,看看会发生什么! –