【问题标题】:Delphi: Access Violation at the end of Create() constructorDelphi:Create()构造函数末尾的访问冲突
【发布时间】:2012-08-30 18:45:04
【问题描述】:

我有一个非常基本和简单的类:

单元加载器;

interface

uses
  Vcl.Dialogs;

type
  TLoader = Class(TObject)
  published
      constructor Create();
  end;

implementation

{ TLoader }    
constructor TLoader.Create;
begin
   ShowMessage('ok');

end;

end.

从 Form1 我这样称呼它:

procedure TForm1.Button1Click(Sender: TObject);
var
 the : TLoader;
begin
  the := the.Create;
end;

现在,在 the := the.Create 部分之后,delphi 显示带有 'ok' 的消息,然后给我一个错误并说 Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x0040559d: read of address 0xffffffe4'.

它也显示了这一行:

constructor TLoader.Create;
begin
   ShowMessage('ok');

end; // <-------- THIS LINE IS MARKED AFTER THE ERROR.

我是德尔福的新手。我正在使用 Delphi XE2,但我无法修复此错误。有人给我指路或有解决方案吗?

【问题讨论】:

  • 我不知道var instance: TLoader 应该做什么。你确定你需要那个全局变量吗?您似乎打算改为声明本地 TLoader 变量。
  • 问题是不是“我如何声明一个类”。它是 Delphi 抛出的一个异常,我无法意识到它来自错误的声明。 :)
  • @xangr 我的评论并不是真的针对你。这是一个明显的重复。我确定我已经回答过不止一次了。我相信安德烈亚斯和梅森也有。但我无法很快找到一个问题来说明这一点。 Stack Overflow 搜索并不能很好地工作,但我怀疑这是一个非常困难的问题。
  • 很难找到这个问题的重复项,@David,因为很难笼统地问这个问题。我们已经看到了许多潜在问题的实例,但每次都将其呈现为“调试我的代码”问题,因为这是从不知道哪里出了问题的人的角度来表达问题的唯一方法。
  • Xangr,编译器没有警告您您正在使用未初始化的变量吗?

标签: delphi delphi-xe2


【解决方案1】:
var
  the : TLoader;
begin
  the := the.Create;

不正确。应该是

var
  the : TLoader;
begin
  the := TLoader.Create;

【讨论】:

  • 我应该睡几个小时 :( 我怎么能错过这一点!谢谢你的问题解决了!谢谢 :)
  • @xangr - 别担心。这是德尔福经典。我已经记不清我这样做的次数了。
  • 你应该 the.ClassType().Create(); :-)))) PS。 @Martin 我相信您也应该调用 inherited; 。很烦人,但这会让你在未来在 Delphi RTL 核心和你自己的代码中重构时更加自我。
  • 不,你不能那样做,@Arioch。 ClassType 函数通过从给定对象读取类引用来工作。在您的建议中,ClassType 将从未初始化的变量中读取,因为还没有有效的对象引用,这与原始问题面临的问题相同。 ClassType是实例方法,所以需要有实例。
  • 你在说什么,@Arioch?虚拟构造函数与此无关。 ClassType 函数在 C++ Builder 中的工作方式与在 Delphi 中的工作方式相同;未初始化的the 变量上的表达式the-&gt;ClassType() 在C++ 中和在Delphi 中一样错误。而在 C++ 中,您如何看待它是一个捷径? C++ 不允许您直接调用 ClasssType 返回的任何构造函数;不起作用的代码不是捷径。
【解决方案2】:

你的语法错误。如果你正在构造一个新对象,你应该在构造函数调用中使用类名,而不是变量名:

procedure TForm1.Button1Click(Sender: TObject);
var
 the : TLoader;
begin
  the := TLoader.Create;
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多