而不是使用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,因此ref的数量应该总是至少为1。确切吗?基本上:即使它是本地的,它是否正确返回?
但是从我SO发现,在这种情况下
procedure test;
var a: TSolution;
begin
SetLength(a, 7);
//do something
end;
的a
当程序超出范围总是释放!
你可以沟渠tmpArr。不要直接声明它并使用Result。也毫无意义地将vals设置为无析构函数。无论如何,le destructor是这样做的,没有意义的做两次。 –
使用'TArray'也更有意义,因为它具有更灵活的类型兼容性。和SetLength(vals,3);自从您稍后覆盖val之后,完全被浪费掉了。你有很大的理解,你不知道的赤字。 –
说了这一切,你根本不应该使用动态数组。它应该是具有三个字段的记录,或者可以是长度为3的非动态数组。我认为一个记录是正确的选择。然后你可以命名这些字段。 –