我用了两个单元文件。一个是Form的(里有一个Edit, 两个Button[1, 2])  另一个就是 TMyMath的type
  TMyMath = class
  private
    ExtendedTemp: extended;
    ExtendedIntRes: int64;
  protected
  public
    function Rounding(x: extended): int64;
    constructor create;
    destructor destroy; override;
  end;implementation{ TMyMath }
constructor TMyMath.create;
begin
  extendedTemp := 0;
  extendedintRes := 0;
end;destructor TMyMath.destroy;
begin
  inherited destroy();
end;function TMyMath.Rounding(x: extended): int64; //这是求四舍五入的函数。
begin
  extendedtemp := x;
  while extendedtemp >= 1 do
  begin
    extendedtemp := extendedtemp - 1;
  end;
  if extendedtemp > 0.5 then
  begin
    extendedtemp := 1;
    extendedIntRes := trunc(x + extendedtemp);
  end
  else
  begin
    extendedIntRes := trunc(x);
  end;
  result := extendedintres;
end;以下是调用TMyMath:procedure TForm1.Button1Click(Sender: TObject); //单击Button1。
  var
    x: integer;
    y: double;
    MyMath: TMyMath; //创建TMyMath的对象“MyMath”
begin
  MyMath := TMyMath.create;  //创建和初始化
  try
    y := strtofloat(edtinput.Text);
    x := MyMath.Rounding(y);
    showmessage(inttostr(x));
  finally
    MyMath.free;  //自己创建的不能释放,调用 Destroy 也不管用。
    button2.free; //控件可以释放
  end;  if MyMath = nil then  //判断对象“MyMath”是否已经被释放?
  begin
    showmessage('ok');
  end
  else
  begin
    showmessage('no');  //最后的运行结果是 no
  end;  if button2 = nil then  //判断Button2控件是否已经被释放?
  begin
    showmessage('ok');  //最后的运行结果是 OK
  end
  else
  begin
    showmessage('no');
  end;
end;
请高手帮帮我。书上没有。。上网查了也没有在QQ群问,也无结果所以,这是最后的希望了 :)请大家帮帮忙。不要笑我的问题太菜。我会努力的。

解决方案 »

  1.   

    为什么 创建的MyMath对象 不能被 释放?????????
      

  2.   

    ...
      finally 
        FreeAndNil(MyMath);
      end;
    ...
      

  3.   

    你理解错了,MyMath.free后,它已经被释放的,但是MyMath并不会自己变成nil,你得自己把它赋成nil,比如:
      MyMath.free;
      MyMath:=nil;
    或者用FreeAndNil函数:FreeAndNil(MyMath);
      

  4.   

     对,free这个函数挺迷惑人的,所以尽量使用freeandnil
      

  5.   

    procedure FreeAndNil(var Obj);
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);
      Pointer(Obj) := nil;
      Temp.Free;
    end;