Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-Boolean属性即使在尚未创建对象时也可用_Delphi_Delphi Xe - Fatal编程技术网

Delphi-Boolean属性即使在尚未创建对象时也可用

Delphi-Boolean属性即使在尚未创建对象时也可用,delphi,delphi-xe,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;

我今天测试了一些东西,我注意到即使没有创建实例,也可以访问对象的布尔类型属性。这怎么可能?尝试修改布尔属性时,会引发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.

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

显然,在测试中,
t
中的值恰好指的是程序地址空间中的某个位置,但内存区域是只读的。你可以读,但不能写。在其他情况下,地址可能不在进程的地址空间中,在这种情况下,即使读取该值也会导致访问冲突


在其他情况下,地址可能既可读又可写,然后您就可以将任何您想要的值写入该位置。由于您写入该位置的数据,程序中可能会发生奇怪的事情;该位置可能由程序的其他部分拥有。

概括一下,为了RBA的好处,托管类型的变量由编译器自动初始化。其他类型则不是。因此,如果您的变量是字符串、接口引用、变量、动态数组、匿名方法或包含托管类型的复合类型,那么它将自动初始化。对象引用不是托管类型。简单类型和包含非托管类型的复合类型都不是。发布测试用例时,请确保已解决所有编译器警告<代码>W1036变量“t”可能尚未初始化