我已经在我的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调用?还有别的吗?
答案 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
仅在构造函数成功完成时分配。
我希望您找到的示例实际上是根据我上面的代码编写的,并且您以某种方式错误地转录了它们。如果按照问题编写,那么它们显然是错误的。