gpt4 book ai didi

Delphi TStringList Free 导致异常

转载 作者:行者123 更新时间:2023-12-03 15:27:19 26 4
gpt4 key购买 nike

考虑这个简短的 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,

  1. 为什么是field_list <> NIL
  2. 是未初始化为 NIL 的对象?
  3. 如果不是NIL它是什么?
  4. 如果它未分配且不是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;

您不必测试 <> 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 may not have been initialized ,这将帮助您自己解决这个问题。)

关于Delphi TStringList Free 导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15445213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com