【问题标题】:Delphi variable might not have been initialized warningDelphi 变量可能未初始化警告
【发布时间】:2012-03-17 17:46:38
【问题描述】:

我已经在我的 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,而忽略警告?相反,我的 try/finally 块是否应该只在成功的构造函数调用之后包围代码,而不是包装 create 调用?还有什么?

【问题讨论】:

    标签: delphi delphi-7


    【解决方案1】:

    在您的代码中,如果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 仅在构造函数成功完成时才被分配。

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

    【讨论】:

    • 我是否需要在 Create 之后在 try 块之前进行任何额外的检查,以确保 Registry 初始化正常?
    • 例如,planet-source-code.com/vb/scripts/… 将是我发现确实出现错误的那种教程之一,因此尝试了解该代码是否真的类似于更高级的 delphi 的问题开发者会不会做。
    • 显然你需要找到比那个网站更好的资源!
    • @JessicaBrown,URL VB 部分就像大红色标志,上面写着CAUTION, WTF AHEAD :-) 事实是,失败的构造函数将导致实例为Destroyed 并返回@ 987654330@
    • @user 小幅更正。当构造函数失败时,它不返回任何内容,并且异常通过赋值传播到实例引用。
    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多