我对ASP.NET应用程序中的内存清理有点困惑。我已经定义了几个析构函数 - 我知道这不是新的.NET处理方式,但我是一个习惯的生物,而且我总是用c ++这样做 - 这在几乎每个场景中都非常有效。但是,我注意到它们有时在我的ASP.NET应用程序中没有被调用。
我正在考虑实现IDisposable,但我认为IDisposable适用于您的代码的其他用户,并且我不确定ASP.NET在完成对象时会调用Dispose。有人可以澄清这个吗?
什么是最好的,最好的我的意思是它总会有效 - 清理我的非托管内存的方法?
修改
This似乎表明如果包含潜在非托管内存的类是封装类的成员,那么析构函数是最好的策略。这对我来说当然有意义,因为我几乎无法尝试或使用类成员。然而,即便如此,这让我回到了我的问题,它有时永远不会在我的ASP.NET应用程序中被调用。
答案 0 :(得分:3)
处理非托管资源的所有类都应实现IDisposable interface。
有关更多信息,垃圾收集器有两个问题。首先,你不知道什么时候会运行。其次,它对非托管资源没有任何了解。这就是为什么它们被称为非托管的原因。
因此,调用代码可以正确dispose
使用非托管资源的对象。执行此操作的最佳方法是实现上述接口,并将对象包装在using ( ) { }语句中,或者至少尝试一次。最后。我通常更喜欢使用声明。
此外,通过实现IDisposable,您向其他开发人员发信号通知此类处理非托管资源,以便他们可以采取适当的步骤来确保正确调用。
答案 1 :(得分:1)
使用托管资源时,您不需要实现IDisposable
或析构函数。所有你需要做的“清理”是将所有顶级(“rooted”)引用设置为null(静态通常被认为是顶级),垃圾收集器将负责其余的。
在调用者忘记调用Dispose或无法调用此类调用的情况下,这样的析构函数主要用于非托管资源。但是,运行时不保证将调用析构函数;只有在最终释放与对象关联的内存之前才会调用它们。您不必实施IDisposable
;这只是一个惯例。使用Close()或Cleanup()方法释放非托管资源是完全合理的。