加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:40:44 所属栏目:大数据 来源:网络整理
导读:我今天正在测试一些东西,我注意到你可以访问一个对象的布尔类型属性,即使没有创建实例.这怎么可能?尝试修改布尔属性时会引发AV. unit Unit4;interfaceuses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs;type TTest = class
我今天正在测试一些东西,我注意到你可以访问一个对象的布尔类型属性,即使没有创建实例.这怎么可能?尝试修改布尔属性时会引发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中的值恰好是指程序地址空间中的某个位置,但内存区域是只读的.你被允许阅读它,但不能写它.在其他情况下,地址可能不在您的进程的地址空间中,在这种情况下,即使读取该值也会导致访问冲突.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读