首页 文章

Delphi动态数组引用计数

提问于
浏览
7

而不是使用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 回答

  • 7

    动态数组是引用计数 . 唐't worry about their memory management - just use them; that'是什么参考计数 . 您不必在析构函数中使用 nil 类字段 . 当对象被销毁时,编译器将删除它们的引用计数 .

    但是当我返回Result时:= tmpArr不会被删除(tmpArr)因为函数超出了范围?

    好吧,不,因为你已经通过将它分配给 Result 而返回了数组,并且可能,调用者也依次将结果分配给一个新变量 . 除非调用者还没有将函数结果分配给新变量,否则引用计数自然将保持至少一个 .

相关问题