Delphi奇怪的无法访问的值(访问冲突)o.O

时间:2014-07-17 18:43:44

标签: delphi

Self is set but Self.Img inaccessible

Self包含Img但Self.Img无法访问

2 个答案:

答案 0 :(得分:5)

“无法访问的值”意味着对此值的引用无效,并且如果取消引用则会发出访问冲突,您的帖子的标题似乎表明正在发生的事情。

此调试数据是否显示在引发访问冲突之前或之后的值?引发异常可能会搞砸调试器在调用堆栈顶部显示的内容,并且不应信任来自前几帧的数据。

如果这是在引发异常之前,这意味着您在某处遇到了损坏的数据。是否只创建了一个(或少数)TPerson对象?如果是这样,你可以在构造函数中放置一个断点并在Img字段上设置一个data breakpoint,当值发生变化时它会中断,这将有助于你追踪腐败。

答案 1 :(得分:4)

根据我的经验,手表中的

无法访问的价值可能意味着两件事之一:

  1. 由于例如访问冲突或
  2. 而无法评估的值
  3. 由于调试信息,优化等不足而无法由调试器评估的值。
  4. 第一个解释会与您发现访问冲突。实际上,我尝试使用以下代码重新创建您的场景:

    {$APPTYPE CONSOLE}
    
    uses
      SysUtils, Classes;
    
    type
      TMyClass = class
        Img: TComponent;
        procedure foo;
      end;
    
    procedure TMyClass.foo;
    begin
      Img := TComponent($deadbeef);
    end;
    
    begin
      TMyClass.Create.foo;
    end.
    

    我在Img的{​​{1}}分配后设置了一个断点,观察列表如下所示:

    enter image description here

    所有迹象都表明,在您的代码中,TMyClass.foo指向无法访问的内存。

    调试器将能够为您确认。如果您已破坏的行执行并产生访问冲突,则ImgSelf无效。证据是Self.Img没问题。但你应该能够毫不费力地调试它。