gpt4 book ai didi

Delphi动态数组引用计数

转载 作者:行者123 更新时间:2023-12-03 14:52:57 26 4
gpt4 key购买 nike

而不是使用geneirc TList<integer>我决定使用

TSolutions = array of integer;

然后:

function TEuclidMod.gcdExtended(p, q: integer): TSolutions;
var tmpArr: TSolutions;
begin

SetLength(tmpArr, 3);

if (q = 0) then
begin
tmpArr[0] := p;
tmpArr[1] := 1;
tmpArr[2] := 0;
end
else
begin
vals := gcdExtended(q, modulo(p,q));
tmpArr[0] := vals[0];
tmpArr[1] := vals[2];
tmpArr[2] := vals[1] - vals[2]*floor(p/q);
end;

Result := tmpArr;

end;

变量vals: TSolutions;在类中声明为私有(private),并且在构造函数中我设置其长度。

<小时/>

我在 docwiki 上读到动态数组是引用计数的,所以我不必担心它们的生命周期。可以肯定的是我已经写了:

constructor TEuclidMod.Create;
begin

SetLength(vals, 3);

end;

destructor TEuclidMod.Destroy;
begin

vals := nil;
inherited;

end;

到目前为止,这应该没问题; vals属于该类,我在该类被破坏时释放它。怎么样tmpArr

我的函数工作正常。 tmpArr是本地的,然后我调用 SetLength 并给他一个长度:如果我没记错的话,这是在堆上创建数组。但当我带着 Result := tmpArr 返回时由于函数超出范围,它不会被删除(tmpArr)吗?我不想返回悬空指针或其他东西!我需要确保它没有被释放。

我想我是安全的,因为它是一个函数并且它返回一个 TSolution,所以引用计数至少应该始终为 1。准确吗?基本上:即使它是本地的,它是否正确返回?

但是从我在 SO 上发现的情况来看,在这种情况下

procedure test;
var a: TSolution;
begin

SetLength(a, 7);
//do something

end;

a当过程超出范围时总是被释放!

最佳答案

动态数组是引用计数的。不用担心它们的内存管理——只需使用它们即可;这就是引用计数的用途。您不必在析构函数中nil 类字段。当对象被销毁时,编译器将删除它们的引用计数。

But then when I return with Result := tmpArr doesn't it get deleted (tmpArr) since the function goes out of scope?

嗯,不,因为您已通过将数组分配给 Result 来返回该数组,并且调用者可能也会将结果依次分配给新变量。引用计数自然会保持至少为 1,除非调用者也没有将函数结果分配给新变量。

关于Delphi动态数组引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45958714/

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