我已经在我的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仅在构造函数成功完成时才会分配此代码中的新对象引用.
我希望您找到的示例实际上是根据我上面的代码编写的,并且您以某种方式错误地转录它们.如果按照问题编写,那么它们显然是错误的.