写了个组件,在Destroy里忘了inherited。放到Form上没问题,就是关不掉,老是有异常,害我调试了半天。

解决方案 »

  1.   

    同意: cnhgj(戲子)(我想养只沙皮狗) !***********************如果还不行,就用刀砍死它,用火烧死它,用水淹子它……最后还不行,就用你处血肉之躯调和大量的酒水喂养它,一定撑死它!
    呵呵,开心吗?开心就干活啦!
      

  2.   

    我说的和FreeAndNil一点关系也没有!我是说Destroy... inherited...如果没有调用inherited为什么会产生异常!
      

  3.   

    destroy是完成基类的释放功能.
    你没有继承,所以那部分释放功能没执行,自然会出错啦!
      

  4.   

    呵呵,要inherited的。做人不要忘本呀,老祖宗的东西怎么可以随便就扔掉呢?
      

  5.   

    VCL中类的祖先TObject实现了资源的分配与回收,
    除非你自己在派生类中能管理这些,
    否则,为什么不交给TObject去管理呢?
      

  6.   

    如果你的类中分配了堆内存,
    你要手动释放,所以就有类似代码:
    destructor TMyClass.Destroy;
    begin
      FMyStringList.Free;  // 在类创建时分配的私有数据
      inherited Destroy;
    end;
      

  7.   

    如果我分配了,但不释放,又会怎么样呢?不就是内存泄漏吗?为什么会产生异常呢?destructor TMyClass.Destroy;
    begin
      FMyStringList.Free;  // 在类创建时分配的私有数据
      //inherited Destroy;
    end;
      

  8.   

    再次引用指向这块内存的指针就出错。你可以看一下Inside VCL等书。
      

  9.   

    Object.Free();
    FreeAndNil(Object);
      

  10.   

    把对象赋值为空
    比如销毁窗体对象Form2:=Nil;
      

  11.   

    让我来说清楚这件事:    当你创建一个对象时,操作系统在内存中为你划出一个空间,连上你的对象变量(所谓连上就是把操作系统在内存中划出的空间地址放入你的对象变量中,记住:你的对象变量只有四个字节的空间大小)。而当你销毁一个对象时,如果你最后没有inherited,则操作系统在内存中为你划出的空间并没有在最后真正的释放掉。由于老祖宗TObject要做最后垃圾清理工作是用汇编语言与底层打交道,如果你没有inherited,自然就没有彻底将这块空间归还给操作系统。所以,在你关闭时就会出现异常,你看看异常的意思翻译过来是不是“暴力进行内存的存取”?译得不好,大体就是如此意思。
      

  12.   

    //SomeObject is an instance & TSomeObject is a class
    try 
      SomeObject:=TSomeObject.create;
    finally
      SomeObject.Free;
      SomeObject:=nil;
    end;
    // or
    if assigned(SomeObject) then FreeAndNil(SomeObject);