Delphi TStringList Free导致异常

Jon*_*ins 4 delphi delphi-3

考虑这个简短的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;
Run Code Online (Sandbox Code Playgroud)

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

  1. 为什么field_list <> NIL
  2. 对象未初始化为NIL
  3. 如果它不是NIL什么?
  4. 如果它没有分配,NIL我怎么不知道Free它是否?该Assigned功能并没有告诉我:if Assigned(an_object)相当于if an_object = NIL

Ken*_*ite 8

问题是if x = '',在finally发生反正.由于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;
Run Code Online (Sandbox Code Playgroud)

<> 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;
Run Code Online (Sandbox Code Playgroud)

(如果你打开提示和警告,编译器会告诉你field_list may not have been initialized,这本来可以帮助你解决这个问题.)

  • 将`if x <>''`语句移动到第一行并使用`try/finally`块将以下代码封装在begin/end中更合乎逻辑. (4认同)