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