全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1002
推到 Plurk!
推到 Facebook!

指標被挪用是否造成記憶體漏失

答題得分者是:Chance36
rachex2000
一般會員


發表:21
回覆:32
積分:20
註冊:2003-04-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-29 15:43:57 IP:210.64.xxx.xxx 未訂閱
請問若一直按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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-31 05:05:00 IP:203.204.xxx.xxx 未訂閱
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
系統時間:2024-05-18 14:47:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!