2012-10-05 49 views
2

這似乎是工作,但我抓我的頭試圖找到內存泄漏,我不是那種東西非常好:-(我需要免費()TDateTime嗎?

const UNIX_START_DATE: TDateTime = 25569.0; 

function UnixToDateTime(USec: Longint): TDateTime; 
begin 
    Result := (Usec/86400) + UNIX_START_DATE; 
end; 

我不是實際調用TDateTime.Create() - 不過是編譯器(這意味着我將不得不釋放它soemwhere)?或者,由於TDateTime是bascially只是一個douuble,是編譯器只是推棧上分配給調用者?

+1

TDateTime字段更有可能泄漏 –

+2

「TDateTime基本上只是一個雙倍」 - 這就是答案。這是「雙」,你應該像對待「雙」一樣對待它。順便說一句,如果你沒有特別指出,那麼你就不能釋放它。 UNIX_START_DATE.Free是否可以編譯? –

+0

+1 @ Arioch'The - 是的,它編譯,運行並做它應該做的。我只是在這裏抓着吸管,試圖找到泄漏。除了TDateTime有一個構造函數(我沒有檢查 - 是否加倍?)之外,我甚至都不會問這個問題,我在很長一段時間內縮小了內存不足異常,並且在定時器終止時fn()被定期調用。我只是想知道。 – Mawg

回答

13

沒有什麼自由。TDateTime是基於Double的簡單類型,因此它不是分配在堆上。

+1

Nitpick:它們可以通過'New'或'GetMem'在堆上分配。 –

+6

@DavidHeffernan:'PDateTime'當然,就像任何其他指針類型一樣。我不認爲這是這個話題。 –

+0

只需列出一些類似於'TDateTime'的類型,它們不需要創建/銷燬,'TTime','TCaption','THandle','TNotifyEvent','TRtlCriticalSection'等等。一些被用作指針,因此需要通過標準外部接口之外的手段來創建/銷燬。例如,創建一個Windows畫布手柄並釋放它。唯一可以創建的是某種類(或對象),以及Delphi的更高版本中的記錄。 –