而不是使用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
返回时,想要返回一个悬空指针或别的东西!我需要确保它没有被释放 .
我想我是安全的,因为它是一个函数,它返回一个TSolution,所以引用计数应至少为1 . 这是确切的吗?基本上:即使它是本地的,它是否正确返回?
但是从我在SO上找到的东西,在这种情况下
procedure test;
var a: TSolution;
begin
SetLength(a, 7);
//do something
end;
当程序超出范围时, a
总是被释放!
1 回答
动态数组是引用计数 . 唐't worry about their memory management - just use them; that'是什么参考计数 . 您不必在析构函数中使用
nil
类字段 . 当对象被销毁时,编译器将删除它们的引用计数 .好吧,不,因为你已经通过将它分配给
Result
而返回了数组,并且可能,调用者也依次将结果分配给一个新变量 . 除非调用者还没有将函数结果分配给新变量,否则引用计数自然将保持至少一个 .