根据MSDN上的这篇文章http://msdn.microsoft.com/en-us/library/ms177197.aspx,我们应该在析构函数中释放终结器中的非托管资源和托管资源。即以下模式:
// destructors_finalizers_1.cpp
// compile with: /clr /c
ref struct A {
// destructor cleans up all resources
~A() {
// clean up code to release managed resource
// ...
// to avoid code duplication
// call finalizer to release unmanaged resources
this->!A();
}
// finalizer cleans up unmanaged resources
// destructor or garbage collector will
// clean up managed resources
!A() {
// clean up code to release unmanaged resource
// ...
}
};
为什么不把它全部放在析构函数中并废弃终结器?是因为垃圾收集器仍然可以不确定地清理对象吗?
答案 0 :(得分:2)
因为如果你跳过析构函数调用(例如,不使用RAII),那么你的非托管资源就会泄漏,而.NET运行时也无法对它们做任何事情。
如果你清理终结器中的非托管资源,那么即使你弄乱你的代码并让你的对象引用在某处飞走,运行时也会运行它:)
基本上,如果你的代码有问题,你就不能指望被调用的析构函数,但是当垃圾收集器回收对象时,将始终调用终结器。