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

Delphi变量可能尚未初始化警告,delphi,delphi-7,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;

我在我的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对象的行上初始化


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

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

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

Registry := TRegistry.Create;
try
  //additional code to access and use the registry object could go here
finally
  Registry.Free;
end;
这是Delphi编码中最基本的生命周期管理模式,您应该将其深深地投入到肌肉记忆中

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


我希望您找到的示例实际上是按照我上面的代码编写的,而您却不正确地转录了它们。如果它们是按照问题编写的,那么它们显然是错误的。

在创建try块之前,我是否需要在创建之后进行任何额外的检查,以确保注册表初始化正常?举个例子,这将是我发现的一种教程,它确实是错误的,因此,我们需要尝试去理解这些代码是否真的像一个更高级的delphi开发人员会做的那样。显然,你需要找到比该站点更好的源代码@JessicaBrown,它的URL
VB
部分就像一个大的红色符号,上面写着
小心,前面的WTF
:-)事实是,失败的构造函数将导致实例被
销毁
ed,并将返回
nil
@用户轻微的更正。当构造函数失败时,它不返回任何内容,异常会通过赋值传播到实例引用。