type
   TMyObj = class 
   public 
     procedure SayHello; 
   end; 
SayHello实现如下:
 procedure TMyObj.SayHello;
 begin 
   showmessage('');
 end; 
下面的代码会不会引发错误,请说明原因: 
var MyObj: TMyObj;
begin 
 MyObj := TMyObj.Create;
 MyObj.Free; 
 MyObj.SayHello;
end;  

解决方案 »

  1.   

    你都把MYOBJ 释放了,还怎么调用它的方法, MYOJB是指针,指向内存块 存放MYOBJ的实体,你把实体释放掉了,指针指向空,当然调用不到方法。MyObj := TMyObj.Create; 
    MyObj.SayHello; 
    MyObj.Free; 
      

  2.   

    肯定是会报错的
    首先你是创建一个TMyObj类,
    你要调用他的方法,必须是存在这个对象,你先Free了,调用方法的时候肯定会报内存访问出错的
      

  3.   

    不会出错,原因是对象没有数据字段,MyObj.SayHello;相当于调用一个普通的方法
      

  4.   

    一般情况下不会报错
    但是你这样做是有问题windows的内存是按页刷新的
    就是这个内存页用完了才会被清除,供其它的对象使用MyObj.Free其实并没有真正的把对象释放,只是把那块内存标记为已不在使用了
    他所在的内存页还没被清除,就说这个对象指向的地址还存在这个对象
    他的方法仍然可以调用
      

  5.   

    同时附上更简单的代码:
    type
      TMyObj = class
      public
        procedure s;
      end;
    ……………………华丽的分割线……………………
    procedure TMyObj.s;
    begin
    end;
    将s在以下代码中调用
    var
     MyObj:TMyObj;
    begin
     MyObj.s;
    end;