gpt4 book ai didi

Delphi编译器错误还是我的错误?

转载 作者:行者123 更新时间:2023-12-03 15:42:25 24 4
gpt4 key购买 nike

以下项目无法运行,并出现“访问冲突”错误。我使用 Delphi XE2 Update 3。

program Project1;

{$APPTYPE CONSOLE}

type
TTestClass = class
public
class procedure Test;
end;

var
TestClass: TTestClass;

class procedure TTestClass.Test;
begin
end;

begin
TestClass.Test;
end.

如果我将类过程Test标记为“静态”,则没有问题。这是“设计的”吗?

PS:这是我的错误,我感到羞耻。

最佳答案

是的,您所目睹的是正确的。

非静态类方法,就像实例方法一样,有一个隐藏的 Self 参数。对于类方法,它指的是类引用。就像编译器将你的方法转换成这样:

type
TTestClassClass = class of TTestClass;

procedure TTestClass_Test(Self: TTestClassClass);

当您在非类接收器(即对象引用)上调用类方法时,编译器会插入对 ClassType 的调用,以使用运行时 对象的类型,如下所示:

TTestClass_Test(TestClass.ClassType);

ClassType 方法获取对象 VMT 的地址,但您的变量不引用任何 VMT。您的变量要么是空指针,要么是未初始化的,因此如果幸运的话,尝试取消引用它以读取 VMT 地址会导致访问冲突。 (如果你运气不好,它会取消引用该地址,而该地址恰好位于程序地址空间中的其他位置,并且结果会被解释为 VMT 指针,即使它不是。)

仅在类引用或有效对象引用上调用类方法。

TTestClass.Test;

当您如上所述在类引用“文字”上调用它时,编译器已经知道第一个参数的值并像这样转换调用:

TTestClass_Test(TTestClass);

关于Delphi编译器错误还是我的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9485828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com