释放TBitmap变量时的访问冲突 - 释放后仍然分配了位图变量?

时间:2016-12-07 17:20:53

标签: delphi free delphi-10.1-berlin tbitmap

我在VCL Forms Application中有这段代码:

implementation

{$R *.dfm}

var
  MyBitmap: TBitmap;

procedure TFormMain.FormCreate(Sender: TObject);
begin
  MyBitmap := TBitmap.Create;
end;

procedure TFormMain.FormDestroy(Sender: TObject);
begin
  if Assigned(MyBitmap) then
    MyBitmap.Free;
end;

procedure TFormMain.Button1Click(Sender: TObject);
begin
  if Assigned(MyBitmap) then
    MyBitmap.Free;
end;

当我第二次点击按钮时,我在按钮的点击处理程序中的MyBitmap.Free;中出现了访问冲突。但是,在第一次按下按钮后,MyBitmap不再被分配。那么为什么条件if Assigned(MyBitmap) then在第二次按钮点击时不起作用,显然它在第一次点击按钮时有效?

Delphi 10.1 Berlin Update 2

1 个答案:

答案 0 :(得分:6)

Assigned函数仅检查指针为Nil。它不会检查它是否指向现有对象。在释放它之后,您需要将其设置为Nil,以使Assigned函数按预期工作。 FreeAndNil执行两条指令。