2012-04-19 120 views
3

我想創建TMyClass對象的二維數組,考慮到每個對象包含TMyClass引用數組,即處置對象數組中的Free Pascal

type 
    TMyClass = class 
     MyArray: array[0..10] of TMyClass; 
     constructor Create; 
     destructor Destroy; 
    end; 

    TMyMatrix = array of array of TMyClass; 

var 
    matrix: TMyMatrix; 

begin 
    SetLength(matrix, 10, 10); 
    (...) { matrix[i, j].Create; ? } 

1)將在處理TMyClass對象時,自動處理引用數組()(不影響實際對象),還是應該手動處理?

2)如何配置物體的動態數組(matrix)?免費的帕斯卡維基說,將nil分配給動態數組可以釋放指針指向的內存,但我認爲它不會調用任何析構函數。

回答

3

1)是的,如果您釋放TMyClass實例,則MyArray將被釋放,因爲其引用計數將降爲零。這是一個例外,如果你在代碼的其他地方全局引用這個數組,這不應該發生在良好的代碼設計中。數組中的實際對象不會自動釋放(讀取)。

2)否,將數組大小調整爲零,將其設置爲空或使其引用計數爲零將而不是自動釋放您在其元素中引用的任何類。你需要自己做,通過2D數組,並正確釋放每個對象。

從文檔中,「將nil分配給動態數組變量會自動釋放指針指向的內存」。就是這樣,所以它不會實際觸及你的類,只會釋放分配給存儲它們的引用的內存(它們是指針)。

Ref。 http://wiki.freepascal.org/DYNAMIC_ARRAY

+1

請注意,您可以通過使用適當的容器來獲得內存管理效果,例如,當'FreeObjects'構造函數參數爲true時'TFPGObjectList'。 – lukstafi 2012-04-20 15:05:33