如何使本地数组成为一个持久的数组?
问题描述:
我有一个回调过程:如何使本地数组成为一个持久的数组?
type
TInitCallback = procedure (var Data: Pointer);
的想法是,经过初始化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;
不过,我不知道,引用计数器增加数组分配时:Data := BoolArray;
。换句话说 - 我不确定该阵列在离开该程序后还是在内存中,还是被释放了?因为在稍后的程序执行中,当我改变其他结构(与该数组无关的记录)中的数据时,此更改会在先前分配的数组(Data)中进行更改。
对此的一种解释是数组的内存在离开回调时被释放,并再次用于记录。
那么,在保留InitData回调后数组是否保持分配?如果没有,如何让它保持分配。请不要说我不想更改我的回调的签名,我不能引入任何新的参数或将其更改为函数。
谢谢。
答
假设在您分配给Data
时,动态数组的引用计数不会增加,这是正确的。这意味着当InitData
返回时,本地数组超出范围。因此你的代码被破坏了。
最简单的解决方案是将TInitCallback
的定义更改为使用动态数组,然后引用机制将为您管理生命期。由于您不希望更改界面,因此您至少有以下选项:
- 使
BoolArray
成为全局变量。这只有在应用程序中只有一个实例时才有效。 - 将
BoolArray
的类型更改为^TBoolArray
,并使用New
将此分配给堆。您还需要添加另一个可以通过调用Dispose
来重新分配阵列的过程。 - 非常类似于选项2,将数组包装到类中。类实例可以安全地存储在指针中。再次,您需要另一个函数来调用
Free
来处理类实例。