为什么我们不在析构函数中释放非托管资源?

时间:2011-08-22 05:36:43

标签: c++-cli

根据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
      // ...
   }
};

为什么不把它全部放在析构函数中并废弃终结器?是因为垃圾收集器仍然可以不确定地清理对象吗?

1 个答案:

答案 0 :(得分:2)

因为如果你跳过析构函数调用(例如,不使用RAII),那么你的非托管资源就会泄漏,而.NET运行时也无法对它们做任何事情。

如果你清理终结器中的非托管资源,那么即使你弄乱你的代码并让你的对象引用在某处飞走,运行时也会运行它:)

基本上,如果你的代码有问题,你就不能指望被调用的析构函数,但是当垃圾收集器回收对象时,将始终调用终结器。