procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap : TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.Free;
Bitmap.Canvas.MoveTo(10,10); //这个语句为什么不发生错误呢?对象已经释放掉了啊
end;procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap : TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.Canvas.MoveTo(10,10); //这里加了这么一句,最下面的语句就会报错,请高手帮忙讲解一下
Bitmap.Free;
Bitmap.Canvas.MoveTo(10,10);
end;
var
Bitmap : TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.Free;
Bitmap.Canvas.MoveTo(10,10); //这个语句为什么不发生错误呢?对象已经释放掉了啊
end;procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap : TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.Canvas.MoveTo(10,10); //这里加了这么一句,最下面的语句就会报错,请高手帮忙讲解一下
Bitmap.Free;
Bitmap.Canvas.MoveTo(10,10);
end;
ShowMessage(Bitmap.ClassName);//加一句你就看出问题来了
9楼的朋友,我加这句,结果是TBitmap,没看出什么,请你指点一下?
var
StrList : TStringList;
begin
StrList := TStringList.Create;
StrList.Free;
StrList.Add('asdf');
ShowMessage(StrList[0]);
end;
这里还可以显示出来,很不解
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
用FreeAndNil释放对象是比较标准的做法
var
StrList : TStringList;
begin
StrList := TStringList.Create;
StrList.Free;
StrList.Add('asdf');
ShowMessage(StrList[0]);
end;
这里还可以显示出来,很不解12楼的朋友,我试过了啊,这段代码不行啊,D7试验的
FreeAndNil是替代Free用的,Inside vcl好象有一处讲过这个问题
定义了一个变量引用,bitmap.free执行以后,bitmap引用的那个对象被释放了,但是bitmap指向的方法指针依然存在(Button1Click方法执行完成后,这些东东才全部不存在)
bitmap.canvas.moveto()调用的时候,canvas对象没有被创建,见TBitmap.GetCanvas方法,又创建了一个Canvas对象并赋值给FCanvas,然后在执行Canvas.moveto方法,这是没有问题的。第二次出错:
执行bitmap.canvas.moveto,实际上Tbitmap中的私有属性FCanvas已经赋值,当执行bitmap.free(见TObject.free)时,FCanvas对象被释放了,然后第二个bitmap.canvas.moveto执行时,Canvas对象,这里通过getCanvas方法引用了FCanvas属性,这个FCanvas属性已经释放了,所以再调用moveto方法就出现关键字错误了。出错时由于TBitmap的私有属性FCanvas引起的。