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

时间:2012-03-17 17:46:39

标签: delphi delphi-7

我已经在我的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;

但是当我在该结构之后实现我的代码时,我收到一个警告,我的变量Registry可能没有在我释放TRegistry对象的行上初始化。

所以,我想知道我发现的示例是否在访问注册表的正确方法上是错误的。我是否应该在我的TRegistry对象上调用Free,无论Create是否成功,只是忽略警告?相反,我的try / finally块应仅在成功构造函数调用之后围绕代码,但不包装create调用?还有别的吗?

1 个答案:

答案 0 :(得分: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仅在构造函数成功完成时分配。

我希望您找到的示例实际上是根据我上面的代码编写的,并且您以某种方式错误地转录了它们。如果按照问题编写,那么它们显然是错误的。