考虑这个简短的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,
field_list <> NIL?NIL?NIL什么?NIL我怎么不知道Free它是否?该Assigned功能并没有告诉我:if Assigned(an_object)相当于if an_object = NIL问题是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,这本来可以帮助你解决这个问题.)
| 归档时间: |
|
| 查看次数: |
1482 次 |
| 最近记录: |