【发布时间】:2017-04-22 18:12:27
【问题描述】:
我在 VCL 表单应用程序中有此代码:
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,释放对象引用不会使其为零。因此,您正在尝试双重免费。
-
看来
System.SysUtils.FreeAndNil(MyBitmap)可以在没有 AV 的情况下完成这项工作。 -
因此,我们最终了解到:可以使用
FREE释放对象,并且可以将对象变量设置为NIL,反之亦然。这是正确的吗? -
MyObject.Free执行时到底发生了什么?对象的内存是否显式释放?具体是如何发布的?这在实践中意味着什么? -
实际上你可以说释放负责释放为对象获取的资源,包括内存。
标签: delphi free delphi-10.1-berlin tbitmap