2013-07-30 49 views
0

線程分配了在Delphi的線程中,何時釋放內存?

FreeOnTerminate := true; 

據我所知,這是它結束時,西港島線的內存被釋放,但什麼時候該終止事件發生?

或者,以更通用的方式,什麼時候釋放某個線程的內存?

+0

沒有'Terminate'事件。所有你需要知道的都可以在名爲'ThreadProc'的程序中找到,它可以在'Classes'中找到。 –

回答

6

FreeOnTerminate是真實的,TThread釋放自己的內存(調用本身自己的析構函數)之後TThread.DoTerminate()已經調用了退出,之後TThread.Execute()已經調用了退出。因此,基本上,一旦調用DoTerminate()(它在內部觸發TThread.OnTerminate事件,如果已分配)並退出,假設您的TThread對象不再有效,如果FreeOnTerminate爲真。

8

當線程被釋放時(IOW,當析構函數退出時)線程本身的內存被釋放。 FreeOnTerminate只是意味着當線程被終止(Execute方法退出)時,析構函數會自動調用。

線程爲其自身使用分配的任何內存都應由線程在其析構函數中釋放。

+0

@DavidHeffernan:AFAIR,TThread.Terminate是一個標誌屬性(執行方法可以忽略或服從),表明線程必須完成它的工作** NOW **。 –

+2

@DavidHeffernan:'FTerminated'(IIRC)標誌已通過調用「TThread.Terminate」設置。肯:那個「或」應該是「和」。或者實際上整個終止事物可以在那裏被移除。 terminate標誌可以被execute方法忽略,並且execute方法可以在沒有調用Terminate的情況下終止。 –

+0

@MarjanVenema:由於'Execute'可以在沒有標誌被設置退出,是不是'或'更合適的(或者是'Terminate'標誌被設置和'Execute'檢查它並退出,* OR *的'執行'功能完成沒有'終止'被設置)? (再次想到,如果'Execute'沒有檢查它,'Terminate'本身不做任何事情,所以你是對的,我會編輯。謝謝。) –