我在一个类的方法中用self.free释放自己,可是稍后用assigned 检查,仍然为true,而它的成员变量仍然能访问,怎么回事?

解决方案 »

  1.   

    个人认为,在类的成员函数中释放自己是不安全的代码。它的释放代码应该在destroy中。
      

  2.   

    我也yjs_lh(长风浪子)的看法,标准的做法是将资源释放的代码放在析构函数中,对某个类实例的释放,应该调用该实例的free方法。例如:
    var frmChild: TForm;
    frmChild := TFrom.Create(nil);
    try
      frmChild.ShowModal();
    finally
      frmChild.Free();
      frmChild := nil;
    end;
    另外,用assigned检查某个已释放的类实例并不正确,必须在释放是将该实例置为NIL。
    即使该实例已经释放,如果没有将实例指针置为空,则指针所指内容为随机,有可能有内容,也有可能没内容,在c中被称为空悬指针。
      

  3.   

    单纯的FREE并没有将指针置NIL;
    用函数FREEANDNIL看看你就知道了;
      

  4.   

    释放后,类的实例的指针并没有赋值为nil,自然assigned返回true。
    你可以试试:labe1.free;if assgined(label1) then showmessage('true');
      

  5.   

    其实很简单的道理,证明:
    var
    Label1, Label2: TLabel;
    begin
    Label1 := TLabel.Create(self);
    Label2 := Label1;//两个变量指向同一个对象。
    Label1.Free();//释放这个对象
    //Label2一定不是nil,自然你也不能要求Label1是nil.
    end;
      

  6.   

    为什么释放自己是不安全的做法呢?是因为释放后不能将自己置nil吗?
      

  7.   

    Object.Free后,Object<>nil。因为Object是一个指针,Free只是清除指针指向的数据。另外,最好不要在类或者实例中释放自己。因为这可能会有一些不安全的问题。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  8.   

    查了一下,VCL的源码里清除自己就是调用自己的Destroy方法,唉,我真笨