Delphi自動管理的記憶體
Delphi中原子變量,如Integer、Boolean、Record、枚舉等都是在作用域內編譯器自動申請內存,出了作用域自動釋放;另外,字串、Variant、動態數組、接口也是由Delphi自動管理。
這些變數都是在堆疊中儲存的,除了介面。另外,Variant是程式設計師用函數手動創建的,例如VarArrayCreate;動態數組也是程式設計師用函數手動創建的,例如SetLength,但這兩種情況都不需要程式設計師自己釋放。
另外,還有一種變數要注意,是使用Threadvar宣告的變量,它的作用域是一個執行緒。這主要用在寫線程函數時,每一個線程都使用一個線程局部儲存。
程式設計師手動管理的內存
指標和物件是需要程式設計師手動申請和釋放的記憶體。
指標包括PChar、Pointer(無型別指標)、記錄指標、變數指標(指向原子變數)、函數指標(例如回呼函數,分為全域函數和物件方法)。使用New函數來申請內存,使用Dispose來釋放指標。另外,GetMem、ReallocMem和FreeMem也是一系列申請、釋放記憶體的函數,可以透過GetMemoryManager和SetMemoryManager函數來讀取和設定Delphi的三個記憶體管理函數。
物件包括TObject和IUnknown兩顆繼承樹繼承下來的子類別物件。必須使用建構方法來建構物件。用構造方法(一般是Create,也可以不是,Delphi的編譯器只認constructor的關鍵字)創建的對象,如果你沒有指定擁有者,那麼必須自己手動釋放,即使是指定了擁有者也需要看實際需要在特定的時刻釋放。釋放一般使用Free方法(IUnknown則不需要手動釋放),更好的方法是使用FreeAndNil(在Sysutils.pas單元),它既釋放佔用的內存,同時釋放指針本身。
這些變數都是在堆中儲存的。另外一個要注意的問題是,TList中的指標都需要程式設計師自己釋放。
註:
1、 回呼函數不屬於記憶體管理的技術範疇,詳細內容請參考《指標》部分。
2、 物件的詳細內容請參考《物件模型》部分。
3、 一個指標被多個地方使用,而其中一個地方釋放了,其他地方再使用就會發生異常,這是一個使用指標應該注意的問題。詳細記憶體請參考《指標》部分。
4. 傳遞指標有兩個很明顯的優點:節省記憶體、提高速度。詳細記憶體請參考《指標》和《設計技巧》部分。
5. 如何判斷物件和指標是一個技術性很強的主題,csdn上有一些講這個主題的帖子,還可以參見Aimingoo([email protected])寫的一篇名為《關於「如何檢測指針是否是對象」的深入探討》的文章。詳細記憶體請參考《指標》和《物件》部分。
完成於2004-1-19 。
版權所有,不當之處請不吝指正。