procedure TForm1.Button1Click(Sender: TObject);
var
p:PChar;
begin
  GetMem(P,100);
  if P=nil then
    Application.Terminate;
  self.Caption:=p^;
end;就这么几行的代码,却是错误的,程序每次执行都会异常。“self.Caption:=p^”一定会执行到,执行“Application.Terminate”程序并不会立刻结束。
那在一个希望应用程序立刻退出的情况,难道调用Halt?但是在《Delphi技术手册》中明确说明不应该调用Halt。

解决方案 »

  1.   

    procedure   TForm1.Button1Click(Sender:   TObject);
    var
    p:PChar;
    begin
        GetMem(P,100);
        if   P<>nil   then
         begin
            Application.Terminate;
            exit;
         end;
        self.Caption:=p^;
    end;
      

  2.   

    这个函数GetMem(P,100); 已经为P分配了地址,不会为nil
    所以 Application.Terminate; 不会执行
    而执行self.Caption:=p^;这一句了
      

  3.   

    procedure       TForm1.Button1Click(Sender:       TObject);
    var
    p:PChar;
    begin
            GetMem(P,100);
            if       P = nil       then
              begin
                    Application.Terminate;
                    exit;
              end;
            self.Caption:=p^;
    end; 
      

  4.   

    不知道这个程序是干嘛用的,如果是想退出的话我觉得是不可能的
    都GetMem了,p怎么可能为nil呢
      

  5.   

    procedure   TForm1.Button1Click(Sender:   TObject); 
    var 
    p:PChar; 
    begin 
        GetMem(P,100); 
        if   P=nil   then 
            Application.Terminate; 
        self.Caption:=p^; 
    end;
    首先,从楼主给出的代码猜测,应该是GetMem执行失败,未分配到内存时,则退出程序。
    在正常情况下,内存未消耗完之前,Terminate是不会执行到的。但是,需要注意的是GetMem所申请的内存是一段未初始化的内存。也就是说,如果把它当成一个字符串用,则无法预测这个字符串的结束符会在哪里,而当给Caption赋值,即从p指针所指向的内存取字符串的时候,由于无法预测到线束位置,从而导致内存访问违例(在早期系统当中,比如win9x最有可能的就是蓝屏)。写一段代码,不管是否测试代码,在没有约束条件的情况下,建议还是考虑一下潜伏的危险性。一不小心代码写多了,复杂了,就有可能把潜在的危险给忽略了,直接Copy到应用当中去,最终导致的后果是难以预料的。
      

  6.   

    同意一楼Application.Terminate;
    是用消息的方式退出程序,如果后面还有别的语句,而没有Exit之类的话,
    得执行完后面的语句,才能处理退出消息。执行下面代码看看,就可以发现消息提示框会出现procedure TForm1.Button1Click(Sender: TObject);
    begin
    Application.Terminate;
    ShowMessage('OK');
    end;
      

  7.   

    不好意思的,可能是我的例子举得不好,其实我的意思就是说Application.Terminate并不能立即结束程序,它只是往消息队列中发送了一个退出消息而已。如果我碰到需要程序立即结束,后面的代码绝对不能执行的地方,我该怎么办呢?难道调用Halt?而Halt在《Delphi技术手册》和Delphi的官方文档中都是明确说明不建议使用的。