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时发生,但搞不懂为什么。

解决方案 »

  1.   

    已经解决了。
    my := TmsgShow.Create; //用这个初始化
    //而不是My.Create;但不明白原理,哪位可以说说?谢谢!
      

  2.   

    My.Create; ==> My:=TmsgShow.Create;
      

  3.   

    TmsgShow.Create称为类TmsgShow的Constructor,作用是申请一块内存,并将其设定为TmsgShow类型,然后返回一个指向该内存的指针。
    这样my := TmsgShow.Create之后,My才有一块真正有效的作用地址。
    在这之前,my仅仅是个空指针,不指向任何有效地址,当然也不能干活,也不能撤销destroy啦。
      

  4.   

    可是即使是用TmsgShow.Create,my.SetMsg('LinQing');和my.disp;都没有出错啊,而且还正常执行了,只是在destroy时引发异常,这个又如何解释?
      

  5.   

    你的程序中My未被指定到一个有效的地址,其实就是随机的。当你 my.SetMsg('LinQing');
    的时候,就已经访问了一个不该被访问的地址,虽然可能可以运行,但该内存不该被这样读写的,因为不是你申请来的。
    disp可以执行是因为,类中的方法的代码是单独定位,不与数据比如msg放在一起的。
    最后destroy失败是因为系统检测出,你根本不应该释放这块内存变量(本不就是你申请来的)。