1

我有一個回調過程:如何使本地數組成爲一個持久的數組?

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回調後數組是否保持分配?如果沒有,如何讓它保持分配。請不要說我不想更改我的回調的簽名,我不能引入任何新的參數或將其更改爲函數。

謝謝。

回答

5

假設在您分配給Data時,動態數組的引用計數不會增加,這是正確的。這意味着當InitData返回時,本地數組超出範圍。因此你的代碼被破壞了。

最簡單的解決方案是將TInitCallback的定義更改爲使用動態數組,然後引用機制將爲您管理生命期。由於您不希望更改界面,因此您至少有以下選項:

  1. 使BoolArray成爲全局變量。這隻有在應用程序中只有一個實例時纔有效。
  2. BoolArray的類型更改爲^TBoolArray,並使用New將此分配給堆。您還需要添加另一個可以通過調用Dispose來重新分配陣列的過程。
  3. 非常類似於選項2,將數組包裝到類中。類實例可以安全地存儲在指針中。再次,您需要另一個函數來調用Free來處理類實例。
相關問題