如何使本地数组成为一个持久的数组?

问题描述:

我有一个回调过程:如何使本地数组成为一个持久的数组?

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的定义更改为使用动态数组,然后引用机制将为您管理生命期。由于您不希望更改界面,因此您至少有以下选项:

  1. 使BoolArray成为全局变量。这只有在应用程序中只有一个实例时才有效。
  2. BoolArray的类型更改为^TBoolArray,并使用New将此分配给堆。您还需要添加另一个可以通过调用Dispose来重新分配阵列的过程。
  3. 非常类似于选项2,将数组包装到类中。类实例可以安全地存储在指针中。再次,您需要另一个函数来调用Free来处理类实例。