2011-11-18 31 views
2
myarr : array [0 .. 21] of array [0 .. 21] of TColor; 

以上的聲明中,使用後,我要摧毀陣列的如何銷燬數組的數組

for a := 0 to 21 do 
    for b := 0 to 21 do 
     myarr[a][b].destroy ; 
     //myarr[a,b].destroy ; 

兩個代碼給我錯誤的陣列,

E2018記錄,對象或類的類型要求(德爾福)

這實際上是在一個類裏面實現的,和我想這樣做時類的對象被銷燬

當用鼠標點擊在執行前面的物體(其包括該陣列)我已實施此必須被銷燬和一個新的對象必須是created.Practically時發生這種情況時,他們必須沒有任何額外的內存,但是當我在Windows任務管理器中爲每次點擊添加另一個200 kb時,我的應用程序會多次執行此操作。

+9

您不能也不需要銷燬一個靜態數組。 – RRUZ

+2

爲什麼-1,請說明一個理由 – VibeeshanRC

+2

我也想知道。@vibeeshanRC,你不能摧毀TColor。如果它是一個類的數組,你可以但TColor不是一個類。你能發佈更多的代碼嗎? –

回答

8

TColor是一個整數類型,一個值類型,而不是一個類。因此它不需要被釋放。的TColor定義是

TColor = -$7FFFFFFF-1..$7FFFFFFF; 

所以你的數組是非常equivlent,爲alloction的宗旨,以

myarr: array [0..21] of array [0..21] of Integer; 

這樣一個數組的元素不需要被釋放。無論您聲明它在哪裏(全局,本地,類成員,記錄成員),數組本身都將自動釋放。這也是一種價值類型。

最好的線索,你不需要免費TColor是你從來沒有創建它的第一個地方。分配和釋放總是配對。


另外,您不應該直接撥打Destroy。你在代碼編寫Destroy實現,只有當被覆蓋的析構函數的一類,即是這樣的:

destructor Destroy; override; 
... 
destructor TMyClass.Destroy; 
begin 
    FMyObject.Free; 
    inherited; 
end; 

當你摧毀一個對象,你應該調用它Free。做不是直接撥打Destroy。爲什麼不?那麼,Free實現這樣的:

procedure TObject.Free; 
begin 
    if Self <> nil then 
    Destroy; 
end; 

if語句的意思是,如果你有一個對象引用是nil,那麼它是安全地調用就可以了Free不用擔心被引發異常。

這對於在構造函數中引發異常的情況很重要。當發生這種情況時,調用析構函數。如果構造函數僅部分完成,則某些字段仍將爲nil。調用Free允許我們編寫乾淨的析構函數代碼。如果沒有這種方便,我們所有的析構函數將如下所示:

destructor TMyClass.Destroy; 
begin 
    if FMyObject3<>nil then 
    FMyObject3.Destroy; 
    if FMyObject2<>nil then 
    FMyObject2.Destroy; 
    if FMyObject1<>nil then 
    FMyObject1.Destroy; 
    inherited; 
end; 
+0

謝謝,我的問題實際上並不準確,但您的答案澄清了我必須做的事情 – VibeeshanRC