關於Exception的問題? |
尚未結案
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
Delphi Version:Delphi5 各位先進好! 下面Code,本想說明因為(3)引起例外,所以(4)的Freemem()沒有release記憶體.
procedure TForm1.Button1Click(Sender: TObject); var p:Pointer; a,b:integer; begin a:=0; // (1) getmem(p,1024); // (2) b:=5 div a; // (3) FreeMem(p,1024); // (4) end;但是: 1.程式在執行時卻沒有錯誤訊息. 2.關於getmem()的使用: 我看到對GetMem函式一般都不加例外處理(通過Google查找得出這個結論),是不是 getmem(p,1024)能夠確保獲得1024 B記憶體. 難道不存在記憶體不夠的時候嗎? 書上的修改答案如下: procedure TForm1.Button1Click(Sender: TObject); var p:Pointer; a,b:integer; begin a:=0; getmem(p,1024); try b:=5 div a; finally FreeMem(p,1024); end; end; |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
您好,關於你的問題,我提一下我的看法: 1.程式在執行時卻沒有錯誤訊息. 原則,除數為0程式執行不可能沒有錯誤訊息.我想是因為Delphi的compile根本沒有compile進去.理由是 程中式b:=5 div a 後,b變數並沒有再拿來做任何的處理.在這種情況之下,這一行執不執行對程式的結果並沒有影響. 聰明的Delphi就會把這一行程式去除.所以,你的程式執行並沒有錯誤訊息,如果改成如下,就會出現除數為0的錯誤訊息了 procedure TForm1.BitBtn1Click(Sender: TObject); var p:Pointer; a,b:integer; begin a:=0; // (1) getmem(p,1024); // (2) b:=5 div a; // (3) ShowMessage(IntToStr(b)); FreeMem(p,1024); // (4) end; 2.記憶體當然有可能不夠用,所以,其實你的程式還可以再修改如下: procedure TForm1.BitBtn1Click(Sender: TObject); var p:Pointer; a,b:integer; begin a:=0; // (1) try getmem(p,1024); // (2) except raise Exception.Create('您的記憶體不足,無法執行程式'); end; try b:=5 div a; // (3) finally FreeMem(p,1024); // (4) end; end; 我想書上會有這樣的說法,也許是在為try-finally這個語法舉個應用的例子而已.並沒有考慮到錯誤處理這一段 |
Leway
一般會員 發表:43 回覆:71 積分:22 註冊:2003-07-29 發送簡訊給我 |
procedure TForm1.Button1Click(Sender: TObject);
var
p:Pointer;
a,b:integer;
begin
a:=0; // (1)
getmem(p,1024); // (2)
b:=5 div a; // (3)//b沒有用,所以編譯器在代碼優化階段將他刪除了,你可以制成ASM,ASM代碼中就已經不存在這條語句了。
FreeMem(p,1024); // (4)
end =========================
語言是工具,最重要是如何解決問題。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |