Delphi变量可能未被初始化警告

11

我在我的Delphi项目中添加了一些代码来与注册表进行交互,使用我在网上找到的一些教程来指导我的努力。我看到的每个例子都似乎使用此结构来访问他们的注册表:

var
  Registry: TRegistry;
begin
  try
    Registry := TRegistry.Create;
    //additional code to access and use the registry object could go here
  finally
    Registry.Free;
end;

但是,当我按照那种结构实现我的代码时,在释放TRegistry对象的那一行上出现了一个警告,提示我的变量Registry可能没有被初始化。

所以,我在想我找到的示例是否只是错误地访问注册表的方式。无论Create方法是否成功,我应该调用TRegistry对象的Free方法,并忽略警告吗?或者,相反,我的try/finally块只应该包围构造函数调用成功后的代码,而不是包装创建调用?还是其他什么问题?

1个回答

23

你的代码中,如果TRegistry.Create引发异常,则Registry变量将不会被分配。 因此,在finally中尝试访问未初始化的变量。

编写代码的正确方法是确保在进入try / finally块之前变量已被分配。

Registry := TRegistry.Create;
try
  //additional code to access and use the registry object could go here
finally
  Registry.Free;
end;

这是Delphi编程中最基本的生命周期管理模式,你应该深刻地将其记在肌肉记忆中。

请注意,如果构造函数失败,则会在传播异常之前整理部分构建的对象。在此代码中,只有在构造函数成功完成后才会分配新对象引用Registry

我希望你找到的示例实际上按照我上面的代码编写,而你可能会因为抄录错误而出现问题。如果它们按照问题所述编写,那么它们显然存在错误。


在 try 块之前,我需要在 Create 之后进行任何其他检查以确保 Registry 已经初始化好了吗? - Jessica Brown
1
@user 小修正。当构造函数失败时,它不返回任何内容,并且异常会传播到实例引用的赋值之后。 - David Heffernan
@Hamsh 错了。代码有问题,因为未初始化的变量具有不确定的值。在 nil 上调用 Free 是可以的,但是如果构造函数引发异常,则不能保证该变量为 nil。 - David Heffernan
@DavidHeffernan 我很感兴趣。如果构造函数引发异常,变量可能被设置为什么?请提供一个变量不是nill的示例!谢谢! - Hamish
https://dev59.com/q2sz5IYBdhLWcg3w0bOl#Gn_inYgBc1ULPQZFfZ48 - Hamish
显示剩余14条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接