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整个数组,不管它的长度。文档甚至这样说。