我有一个关于在这里分配的问题,我想知道
Assign
是否复制整个对象和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 :(得分:5)
不,释放一个已从另一个对象分配的对象不会释放源对象。
Assign的功能如何完全取决于类。每个类必须实现Assign,然后调用inherited并在类兼容时从源到目标分配自己的自定义属性。我建议查看这些类的源代码,检查它们是否实现了Assign。
答案 1 :(得分:3)
Assign是一个必须按类实现的例程,因此它执行的是编程执行的操作。 假设试图复制作为参数传递的整个对象,以及它可以。但如果它不能,它可能不应该复制任何东西。
某些类可能具有不符合未强制“合同”的实现,只能复制所需的部分。换句话说,复制的内容完全取决于实现。
Assign没有特殊含义,是一个正常的函数,而不是某种编译魔术。它对作为参数传递的对象没有任何作用,因此释放一个对象不会影响另一个对象。对象是完全独立的。
请注意,并非所有类都实现Assign。您可能认为您为类调用了Assign,但它实际上可能是继承的Assign,它不知道要复制的派生类中的任何新成员。分配的概念很好,但不幸的是,它通常没有实现或没有正确实现。