加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi TStringList Free导致异常

发布时间:2020-12-15 09:18:30 所属栏目:大数据 来源:网络整理
导读:考虑这个简短的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 f
考虑这个简短的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可能没有被初始化,这可以帮助你自己解决这个问题.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读