Delphi 2006-分配动态数组函数结果
我的代码具有如下所示的基本结构:Delphi 2006-分配动态数组函数结果,delphi,variable-assignment,dynamic-arrays,delphi-2006,Delphi,Variable Assignment,Dynamic Arrays,Delphi 2006,我的代码具有如下所示的基本结构: type TDynamicArray = array of double ; var a : TDynamicArray ; function Func : TDynamicArray ; var b : TDynamicArray ; begin SetLength (B, 3) ; b [0] := 0.0 ; b [1] := 1.0 ; b [2] := 2.
type
TDynamicArray = array of double ;
var
a : TDynamicArray ;
function Func : TDynamicArray ;
var
b : TDynamicArray ;
begin
SetLength (B, 3) ;
b [0] := 0.0 ;
b [1] := 1.0 ;
b [2] := 2.0 ;
Result := b ; // note 1 -- should use Result := Copy (b, 0, Length (b))
end ;
begin
a := Func ; // note 2 -- should we (or could we) use a := Copy (Func, 0, Length (Func))
end.
直到最近函数开始返回空数组时,它一直工作正常。然后我发现了一个事实,简单的赋值是不正确的,我需要使用Copy
两个问题:
- 我意识到我需要在标有
注1的行上“复制”以分配给 函数结果。我是否也需要在分配任务时使用
数组Copy
(第a
)的函数结果行注释2
- 为什么编译器允许我的构造?编译后的代码实际上是什么 做什么
我意识到我可以尝试这些东西并看到,但是编译器让有问题的东西通过,我有点害怕。没有理由在这些赋值语句中使用
Copy
。正常作业很好。分配b
时,数组的引用计数为1。当您将其分配给结果
时,参考计数变为2。(就我个人而言,我只是放弃了b
,从一开始就直接对Result
进行操作。)当函数返回时,b
超出范围,引用计数再次变为1。最后,当结果分配给a
时,不会发生任何事情,因为result
实际上一直是a
的别名。最终,您只剩下一个独特的阵列,它应该正是您想要的
编译器允许您的代码,因为您的代码很好。编译器识别数组之间的赋值,就像它识别字符串之间的赋值和接口引用之间的赋值一样,并生成相应的代码来调整引用计数
使用
Copy
将创建数组的整个副本,但您不需要这样做。每次你认为你需要它的时候,它都会放在一个你会立即丢弃前一份的地方。既然你已经有了一个非常好的阵列,可以随时使用,为什么还要复制呢?顺便说一句,你肯定不会想要副本(Func,
正如您在注释中所示,因为它将运行Func
两次。但对于您的ain问题,我不确定Delphi如何处理本地动态数组变量。我将在函数中使用复制到result
,或者直接使用result
。该代码没有问题,数组仍然是堆分配ed和ref计算在内。你也可以直接处理“结果”。@Sertac aaahhh…哪种代码?实际代码的结构不能直接处理函数结果。我需要能够将本地数组分配给result
@ross-这很好。不过,堆栈上的是指向数组的指针-数组本身位于堆。只要你保留对数组的引用,它就不会被最终确定。你引用的链接似乎并不相关。如果你真的认为你需要复制一个数组-这不像你想象的那么频繁,我保证-注意你不需要知道它的长度。你可以调用copy
,只需一个参数,它就会复制它e整个数组,不管它的长度。文档甚至这样说。