我在一个dll中的finalization区释放对象,这样主程序在调用FreeLibrary时应该就能执行finalization中的释放对象的语句了,但是跟踪主程序时执行到FreeLibrary时就死机了,而跟踪dll时发现finalization中的语句还没执行就死机了。我把finalization中的语句搬到其它地方,这样就能正常释放对象了,不知是何原因,请高手指点

解决方案 »

  1.   

    确实不应该放在 finalization 这里释放的,虽然DLL所占用的内存没有被释放,但是它的指针到了这一步已经不存在了。
      

  2.   

    在finalization中释放ADOQuery之类的东西是出错的,但像TStrings之类的东西绝对是没有问题的
      

  3.   

    在 finalization 释放对象注意这样的一些问题。1、你的对象是否实现了interface,并且从TInterfacedObject继承的,这样的对象,如果你曾经引用过他的接口,那么它的引用计数机制就会发生作用,这种对象在Create的时候,如果接受创建实例的变量是一个对象指针,那么他的引用计数是不会自动增加的,在你使用它的interface转换他的类型的时候,他会自动增加引用计数1,这时候计数器上面是1,一旦这个引用对象的接口指针离开作用域或者被赋值为其他对象或者赋值为nil,会自动减少引用计数1,这时候引用计数为0,导致对象被自动释放,此时,你在finalization按照常规Free对象就会造成访问违例。正确的做法是,如果你打算要全局保持这个对象本身,并且不知道是否会引用接口,那么在创建后调用一次_addref。在finalization释放时候调用_Realse而不是Free。2、你的内部对象是否使用了其他包含接口的对象,如果其他的程序设计不当,就会导致上述1的问题,而此时你的程序就会报错,虽然不是你的责任,但是会影响你的程序。同时,finalization执行时候顺序不确定(按照uses引用树决定次序的吧),即便其他对象设计的是正确的,也会导致你的程序出错。所以,使用finalization时候必须认为它是无序的,任何依赖顺序释放的过程都不能放在其中(除非是一个单元中的次序)