当前位置 : 主页 > 编程语言 > delphi >

Delphi TStringList Free导致异常

来源:互联网 收集:自由互联 发布时间:2021-06-23
考虑这个简短的Delphi程序: procedure TfrmXQuery.FieldListFillFromDefault;var field_list: TStringList;begin try if x '' then begin field_list := TStringList.Create; {do some stuff with field_list} end; finally if field_list NIL the
考虑这个简短的Delphi程序:

procedure TfrmXQuery.FieldListFillFromDefault;
var
  field_list: TStringList;
begin
  try
    if x <> '' then begin
      field_list := TStringList.Create;
      {do some stuff with field_list}
    end;
  finally
    if field_list <> NIL then 
    begin
      field_list.Free;
    end;
  end;
end;

当我在Delphi 3中运行它时,x =”以便永远不会创建field_list,

>为什么是field_list<>零?
>对象未初始化为NIL?
>如果它不是NIL是什么?
>如果它是未分配的而不是NIL我怎么知道是否要释放它? Assigned函数没有告诉我:如果Assigned(an_object)等于an_object = NIL

问题是,如果x =”,最终会发生.由于field_list仅在x<>时初始化. ”,它是该点之前的随机内存位置,因为它是一个未初始化的局部变量.随机值允许调用field_list.free,因为它不等于nil. (Delphi不初始化局部变量(在函数或过程中声明的变量).)

var
  somevar: sometype;    
begin
  // at this point, somevar is just a chunk of memory that
  // holds whatever happens to be in that chunk
  somevar := nil;         // now somevar = a specific value you can test

  // other code
end;

你不应该测试<> nil(正如其他人在评论中指出的那样)是否正确构造了代码.

procedure TfrmXQuery.FieldListFillFromDefault;
var
  field_list  : TStringList;
begin
  if x <> '' then 
  begin
    field_list := TStringList.Create;
    try
      {do some stuff with field_list}
    finally
      field_list.Free;
    end;
  end;
end;

(如果你打开提示和警告,编译器会告诉你field_list可能没有被初始化,这可以帮助你自己解决这个问题.)

网友评论