释放 TBitmap 变量时出现访问冲突——释放后位图变量是否仍被分配?
Access violation when freeing TBitmap variable -- Bitmap variable still assigned after freeing?
我在 VCL Forms 应用程序中有这段代码:
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 柏林更新 2
Assigned
函数只检查指针为Nil
。它不检查它是否指向现有对象。您需要在释放它后将其设置为 Nil
才能使 Assigned
函数按预期工作。 FreeAndNil
执行两条指令。
我在 VCL Forms 应用程序中有这段代码:
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 柏林更新 2
Assigned
函数只检查指针为Nil
。它不检查它是否指向现有对象。您需要在释放它后将其设置为 Nil
才能使 Assigned
函数按预期工作。 FreeAndNil
执行两条指令。