Type TmsgShow = Class
private
msg : String;
public
procedure SetMsg(str : String);
procedure disp;
end;procedure TmsgSHow.SetMsg(str : String);
begin
msg := str;
end;procedure TmsgSHow.disp;
begin
ShowMessage(msg);
end;procedure TForm1.Button2Click(Sender: TObject);
var
My: TmsgShow;
begin
My.Create;
my.SetMsg('LinQing');
my.disp;
My.Destroy;
end;发现错误在执行My.Destroy时发生,但搞不懂为什么。
private
msg : String;
public
procedure SetMsg(str : String);
procedure disp;
end;procedure TmsgSHow.SetMsg(str : String);
begin
msg := str;
end;procedure TmsgSHow.disp;
begin
ShowMessage(msg);
end;procedure TForm1.Button2Click(Sender: TObject);
var
My: TmsgShow;
begin
My.Create;
my.SetMsg('LinQing');
my.disp;
My.Destroy;
end;发现错误在执行My.Destroy时发生,但搞不懂为什么。
my := TmsgShow.Create; //用这个初始化
//而不是My.Create;但不明白原理,哪位可以说说?谢谢!
这样my := TmsgShow.Create之后,My才有一块真正有效的作用地址。
在这之前,my仅仅是个空指针,不指向任何有效地址,当然也不能干活,也不能撤销destroy啦。
的时候,就已经访问了一个不该被访问的地址,虽然可能可以运行,但该内存不该被这样读写的,因为不是你申请来的。
disp可以执行是因为,类中的方法的代码是单独定位,不与数据比如msg放在一起的。
最后destroy失败是因为系统检测出,你根本不应该释放这块内存变量(本不就是你申请来的)。