Wod*_*dzu 1 delphi pointers memory-management delphi-2009 dynamic-arrays
我有一个回调程序:
type
TInitCallback = procedure (var Data: Pointer);
Run Code Online (Sandbox Code Playgroud)
这个想法是在初始化之后Data
可以指向任何东西.
我试图将这个过程分配给回调和init Data
,它应该指向一个新创建的数组:
type
TBoolArray = array of Boolean;
procedure InitData(var Data: Pointer);
var
BoolArray: TBoolArray;
i: Integer;
begin
SetLength(BoolArray, 10);
for i := 0 to Length(BoolArray) - 1 do
BoolArray[i] := False;
Data := BoolArray;
end;
Run Code Online (Sandbox Code Playgroud)
但是,在分配时,我不确定数组的引用计数器是否增加:Data := BoolArray;
.换句话说 - 我不确定该数组在离开程序后仍然在内存中还是已被释放?
因为稍后在程序执行中,当我更改某些其他结构中的数据(与该数组无关的记录)时,此更改会在先前分配的数组(Data)中进行更改.
对此的一种解释是,在离开回调时释放了数组的内存,并再次重新用于记录.
那么,在离开InitData回调之后数组是否保持分配状态?如果没有,如何让它保持分配.请注意,我不想更改回调的签名,我不能引入任何新的参数或将其更改为函数.
谢谢.
假设在分配时动态数组的引用计数不增加,这是正确的Data
.这意味着InitData
返回时本地数组超出范围.因此你的代码被破坏了.
最简单的解决方案是更改TInitCallback
使用动态数组的定义,然后引用机制将为您管理生命周期.由于您不希望更改界面,因此您(至少)有以下选项:
BoolArray
一个全局变量.只有在您的应用程序中只有一个实例时,这才有效.BoolArray
to 的类型^TBoolArray
并使用New
它在堆上分配它.您还需要添加另一个过程,该过程将通过调用取消分配数组Dispose
.Free
.