指標被挪用是否造成記憶體漏失 |
答題得分者是:Chance36
|
rachex2000
一般會員 發表:21 回覆:32 積分:20 註冊:2003-04-28 發送簡訊給我 |
請問若一直按Button1,最後關閉Form1時,是否會造成只有最後一個TForm2的instance被清除,而前幾個TForm2的instance因為指標Form2被挪用,而無法參考到,而造成記憶體漏失?或是因為已經指定了Owner,一定會隨著owner被free?? 又若Form2是local variable時,又是怎樣??
uses unit2; procedure TForm1.Button1Click(Sender: TObject); //var //Form2: TForm; begin Form2 := TForm2.Create(Self); Form2.Show; end; |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
rachex2000 你好 首先確立幾個觀念
1.物件變數其實就是一個指標(物件指標),只是經過Delphi的包裝可以比較方便的使用。
2.物件的建立就是記憶體的配置(依類別的定義配置記憶體)
所以
Form2 := TForm2.Create(Self); 則是配置記憶體以建立一個TForm2類別的物件(instance),及將Form2物件變數指向該位置,並將該物件交由Self(指Form1)管理,而Form1會在釋放其本身的記憶體前,先行釋其所管轄的物件, 因此多次按Button1之後Form2變數是指向最後建立的TForm2物件,而之前建立的物件,只是沒有什麼變數指向它而己,當然也沒辦法去操作它,除非使用Form1.Components[n]的方式找到它後才可以操作,而當Form1在要結束前會先行釋放其所屬的物件所以不會有記憶的漏失的問題,但會有記憶體使用過量的狀況發生(在不結束程式狀況下多次按下Button1)。 但是Form2 := TForm2.Create(nil); 由於沒設定Owner,表示物件建立後沒有人來管,當第多次建立後,由於前面建立的物件,沒有變數指向它(Form2指到新建立的物件,也就是Form2被挪用了),也沒有那個Contaner管理它,在執行期間記憶體的使用就可能無限的飆漲到掛點為止(狀況同上),而且在程式結束的時候,由於記憶體的釋放不乾淨而造成當機現象。 另外,若Form2是local variable時,在TForm2.Create;後,接著Form2的可視範圍馬上就結束了,因此剛建立的物件馬上就變孤兒了,前面的是在下一次建立時才會變孤兒,現在是馬上啊! 拉拉雜雜的寫一堆,希望可以了解 _______________________________________
深藍的魚,祝您好運..........連連 發表人 - chance36 於 2004/07/31 05:10:05
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |