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

關於Exception的問題?

尚未結案
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-25 09:49:15 IP:61.150.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-25 10:41:20 IP:61.222.xxx.xxx 未訂閱
您好,關於你的問題,我提一下我的看法:    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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-27 11:28:48 IP:218.80.xxx.xxx 未訂閱
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 ========================= 語言是工具,最重要是如何解決問題。
系統時間:2024-06-29 11:34:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!