gpt4 book ai didi

Delphi 2006 - 分配动态数组函数结果

转载 作者:行者123 更新时间:2023-12-03 19:41:40 27 4
gpt4 key购买 nike

我的代码具有以下说明的基本结构:

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.

直到最近该函数开始返回空数组时,它一直运行良好。然后我发现 this这让我意识到简单的分配是不正确的,我需要使用 Copy .

两个问题:
  • 我意识到我需要在标记为 Note 1 的行上“复制”分配给
    函数结果。我需要使用 Copy也受命于
    函数结果到数组a (行 Note 2)?。
  • 为什么编译器允许我的构造以及实际编译的代码是什么
    正在做?

  • 我意识到我可以尝试这些事情并看看,但我有点害怕编译器让有问题的东西通过。

    最佳答案

    没有理由使用Copy在这些赋值语句中的任何一个中。正常分配工作正常。当您分配 b ,数组的引用计数为 1。当您将其分配给 Result ,引用计数变为 2。(我个人只是放弃 b 并从一开始就直接对 Result 进行操作。)当函数返回时,b超出范围,引用计数再次变为 1。最后,当结果赋值给a ,没有任何 react ,因为 Result实际上是 a 的别名一直。最终,您只剩下一个独特的数组,这应该正是您想要的。

    编译器允许您的代码,因为您的代码很好。编译器识别数组之间的分配,就像它识别字符串之间的分配和接口(interface)引用之间的分配一样,它会生成正确的代码来相应地调整引用计数。

    使用 Copy将创建数组的完整副本,但您不需要它。每次你认为你需要它时,它都放在一个无论如何你都会立即丢弃以前的副本的地方。当您已经准备好一个完美的阵列以供您想要的任何用途时,为什么还要制作副本?

    关于Delphi 2006 - 分配动态数组函数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19128566/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com