我不太明白Tobject类的free方法和析构函数之间的关系,是不是free方法负责清除类的在var处声明的变量,而析构函数负责清除在类方法中动态分配的内存?还有,在C++中,有拷贝构造函数来避免在类方法中申请的资源被二次析构,而在object pascal中是利用什么机制来避免这一问题的?

解决方案 »

  1.   

    procedure TObject.Free;
    begin
      if Self <> nil then
        Destroy;
    end;
    Free就是判断对象实例是否为nil,来调用Destroy析构函数
    就是这样的关系
    VCL对象必须用堆生成,用前要Create,用后要Free
    a := TObject.Create
    a.Free;这跟c++中在堆中创建对象释放对象new,delete类似,
    二次析构不是太明白,能否说说
      

  2.   

    pascal的析构函数是清除你在类中create的对象,或是完成其它的一些功能,比如把一些标记存入文件,或更新主界面之类的.
      

  3.   

    free通过判断来调用destroy函数释放建立的对象
      

  4.   

    if Self <> nil then
        Destroy;
    所以Free方法不正避免了二次析构的问题嘛?
      

  5.   

    难道free不做任何工作,他只是判断self是否为nil,然后调用Destroy ?? 所有清除工作全让Destroy来做?
      

  6.   

    Destroy 为TOBJECT定义的一个虚函数
    所以不同的子类可以OVERRIDE 这个函数从而实现不同子类的析构,这也是OOP的一个典型的方法。
    free为TOBJECT的一个静态函数
    function tobject.free(self:tobject);
    if Self <> nil then 
        Destroy;//多态的典型用法
    end;
      

  7.   

    第一题的详细回答
      首先
      var 
        I:TBUTTON
    I 变量只是一个指针, sizeof(I)=4
    这一点C++BULDER讲的很清楚
    如果
      I:=TBUTTON.CREATE //在堆中分配MEM
      那么I变量指向了一个空间
      这个空间有他的成员还有一个VMT的指针
      那么这个空间大小为
      I.INSTANCESIZE
      也就是现在I的指针初始化了
      实际上CREATE在tobject中已经定义了
      他就是GETMEM(TT,INSTANCESIZE),然后做初始化什么的好多细节可以看其它的书.
      所以最后要对I.Free把I指向的空间FREE掉,否则就泄露了第二个问题不知道你的意思
      

  8.   

    首先很感谢大家的热情解答,但我希望大家能答的“对口”一点,我问的是:
    ============
    我不太明白Tobject类的free方法和析构函数之间的关系,是不是free方法负责清除类字段,而析构函数负责清除在类方法中动态分配的内存?
    ============大家想要解答的话希望能回答是或不是,如果不是又是怎样的机制?
    还有,上面那个关于free的伪代码我在mastring delphi也见过,我想知道的是
    free里除了这些工作是不是还有其他的工作,他难道只是判断self是否为nil ?对于第二个问题我明白了,其实就像 eulb(执子之手,与子偕老) 所说,谢谢。
    我OBJECT PASCAL看的太粗了点,什么都往C++上类比
      

  9.   

    frman:
    那不是Free的伪代码,就是Free的源代码
    就是判断Self是否为nil
    如果不为nil就调用Destroy
    没别的了
      

  10.   

    就是判断Self是否为nil
    如果不为nil就调用Destroy
    一般DESTROY里面会调用FREEINSTANCE的类方法
    而FREEINSTANCE的类方法就是释放你CREATE里面获得的MEM
      

  11.   

    xzgyb:
     那确实是伪代码,因为真正的free是用汇编写的:)算了,我也不想深究了,我差不多明白了,谢谢大家