我正在做一个解决同等系统(代数)的程序,并且创建了一个名为TCongruence的类,该类带有构造函数,函数,类函数等。我已经声明了一个私有变量:

private
 x: array of TCongruence;


当我尝试填充此数组时,我正在编写以下代码:

counter := counter + 1;
SetLength(x, counter);
x[counter-1] := TCongruence.Create(...);


我了解这段代码在花了这三行之后会起作用,因为我的原始代码是这样的:

counter := counter + 1;
SetLength(x, counter);
tmp := TCongruence.Create(...);
x[counter-1] := tmp;


我当然有tmp: TCongruence。为什么第二段代码错误?
类是引用,因此鉴于我没有在tmp上调用Free的事实,我认为我可以做类似的事情。



错误=在编译时很好,但是在运行时访问数组时,我得到了奇怪的值。

最佳答案

两种变体之间没有实际区别。分配给中间局部变量似乎有点浪费,但它不会改变程序的行为。

如果行为有所不同,那可能是由于您在程序的其余部分中看不到的其他因素造成的。

最后,一次增加一个元素的数组有点笨拙,可能会很慢,并且可能导致内存碎片化。通常,使用类似TList<TCongruence>TObjectList<TCongruence>的类会更有意义。然后,您可以编写:

List.Add(TCongruence.Create(...))

09-25 15:31