Delphi - 即使尚未创建对象,也可以使用布尔属性

时间:2013-04-22 16:09:04

标签: delphi delphi-xe

我今天正在测试一些东西,我注意到即使没有创建实例,也可以访问对象的布尔类型属性。这怎么可能?当尝试修改布尔属性时,会引发AV。

unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TTest = class(TObject)
    public
     bBool : Boolean;
  end;
  TForm4 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.FormCreate(Sender: TObject);
var t : TTest;
begin
 if t.bBool then
  ShowMessage('what????');//this message is showed
 t.bbool := false; //AV...
end;

end.

1 个答案:

答案 0 :(得分:11)

对象引用类型的局部变量(例如t变量)未初始化。它们包含在输入函数时发生在堆栈或相关寄存器中的任何值。您的t变量未初始化。

显然,在你的测试中,t中的值碰巧引用程序地址空间中的某个位置,但内存区域是只读的。你被允许阅读它,但不能写它。在其他情况下,地址可能不在您的进程的地址空间中,在这种情况下,即使读取该值也会导致访问冲突。

在其他情况下,地址可能是可读的可写的,然后您可以被允许写入您想要的任何值到该位置。由于您写入该位置的数据,您的程序后期可能会发生奇怪的事情;该位置可能由您的程序的其他部分所有。