【问题标题】:EAccessviolation AV Error using variables in Private使用私有变量的 EAccessviolation AV 错误
【发布时间】:2012-09-14 10:03:30
【问题描述】:

我正在整理我收到的一些代码,出于某种原因,如果变量是在“私有”下定义的(它们需要在此单元内限制访问)。写信给他们时我收到 EAccessViolation 错误。如果我在实现之前在 Var 下松散地定义它们,它们就可以正常访问。我正在将我的结构与其他类似单位进行比较,其中私人单位工作正常且无法发现任何显着差异。有什么建议吗?

错误消息:项目 --- 引发异常类 EAccessViolation 错误,并显示消息“模块中的访问违规错误----。读取地址 0000050F

interface
uses
  dialogs, math, dateutils, SysUtils, classes;
type
     //double = extended;   
     TDoubleDoubleArray = array of array of double;
     TSunPositionAlgorithm = class (TObject)
         private
           FLocationChanged: boolean;
         public
           Constructor Create;
           Destructor Destroy;
           procedure SetDefaults;
         end;
  Var
    SunPositionAlgorithm : TSunPositionAlgorithm;
           F_L0: Double;
           F_L1: TDoubleDoubleArray;

implementation
  {TSunPositionAlgorithm }

constructor TSunPositionAlgorithm.Create;
begin
  SetDefaults;
end;

procedure TSunPositionAlgorithm.SetDefaults;
Begin
F_L0:= 1;                   // works ok
  FLocationChanged:=true;  // throws eaccess violation error
End;

调用函数(在 David H 的第一个问题后添加到 Post):

  procedure TSun.NRELPositionOfSun(const DateTime: TDateTime; var Azimuth, Elevation, Declination: double);
  Var

    LSunPositionAlgorithm : TSunPositionAlgorithm;
  Begin
    LSunPositionAlgorithm := TSunPositionAlgorithm.Create;
    Try
      LSunPositionAlgorithm.SetDefaults;

  blah..


    Finally
      LSunPositionAlgorithm.Destroy;
    End;
  End;

【问题讨论】:

    标签: delphi pascal


    【解决方案1】:

    您尚未显示调用此代码的代码。但是,很明显您没有有效的TSunPositionAlgorithm 对象。

    得到这样的一个:

    procedure Test;
    var
      spa: TSunPositionAlgorithm;
    begin
      spa := TSunPositionAlgorithm.Create;
      try
        spa.SetDefaults;
      finally
        spa.Free;
      end;
    end;
    

    你可能有这样的代码:

    procedure Test;
    var
      spa: TSunPositionAlgorithm;
    begin
      spa.SetDefaults;//oops, spa has not been initialised yet  
    end;
    

    或者可能是这样的:

    procedure Test;
    var
      spa: TSunPositionAlgorithm;
    begin
      spa.Create;//oops, spa has not been initialised yet  
    end;
    

    更新您现在已经显示了调用代码,但您显然还没有显示全部,因为问题中的代码没有表现出您描述的行为。我的观点仍然存在,您必须在某处有一个无效的对象引用。我已经展示了几种最常见的实现方式。但是还有其他方法可以获取无效的对象引用。


    问题中代码的另一个问题是您的析构函数。它们必须始终使用override 指令进行标记。

    destructor Destroy; override;
    

    您必须这样做才能在释放对象时调用您的析构函数。

    【讨论】:

    • 嗨大卫,感谢您的快速响应,关于检查调用代码的要点,尽管我的结构与您的测试 fn 几乎相同,(我已将调用函数添加到原始问题) .还有关于创建/销毁语法的好点,我会整理一下并查看它是否运行
    • 嗯,目前还没有雪茄,在 fastmm4 中使用和不使用 fulldebug 模式和内存泄漏报告时会出现问题
    • 问题中的代码不是真正的代码。该代码不会产生访问冲突。请发布显示您描述的行为的真实代码。
    • 啊..灯泡时刻...完整的代码会很大,但我设置了一个小测试程序..它工作正常(就像上面的应用一样)..所以回顾一下主要代码和创建/销毁结构,我认为问题可能是 TSunPositionAlgorithm 是由另一个也在运行时创建的对象创建的(但不正确)。因此我需要检查层次结构不同级别的所有create-call-destroy结构是否正确。
    • 发现了这个错误 :-) 我曾在 create-destroy 之外调用了“SunPositionAlgorithm.SetDefaults”,删除了该调用 & 现在一切正常:-)。感谢大卫的提示:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    相关资源
    最近更新 更多