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

Jes*_*own 10 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;
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)

这是Delphi编码中最基本的生命周期管理模式,你应该深入研究肌肉记忆.

请注意,如果构造函数失败,那么它将在传播异常之前整理部分构造的对象.Registry仅在构造函数成功完成时才会分配此代码中的新对象引用.

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