我今天正在测试一些东西,我注意到你可以访问一个对象的布尔类型属性,即使没有创建实例.这怎么可能?尝试修改布尔属性时会引发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.
Run Code Online (Sandbox Code Playgroud)
Rob*_*edy 11
对象引用类型的局部变量(例如t变量)未初始化.它们包含在输入函数时发生在堆栈或相关寄存器中的任何值.您的t变量未初始化.
显然,在您的测试中,值t恰好是指程序地址空间中的某个位置,但内存区域是只读的.你被允许阅读它,但不能写它.在其他情况下,地址可能不在您的进程的地址空间中,在这种情况下,即使读取该值也会导致访问冲突.
在其他情况下,地址可能既可读也可写,然后您可以将所需的任何值写入该位置.由于您写入该位置的数据,您的程序后期可能会发生奇怪的事情; 该位置可能由您的程序的其他部分拥有.
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |