【问题标题】:Why don't we release unmanaged resources in destructor?为什么我们不在析构函数中释放非托管资源?
【发布时间】:2011-10-31 21:28:18
【问题描述】:

根据这篇文章,MSDN上的http://msdn.microsoft.com/en-us/library/ms177197.aspx,我们应该释放终结器中的非托管资源和析构器中的托管资源。 IE。以下模式:

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

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

【问题讨论】:

    标签: c++-cli


    【解决方案1】:

    因为如果您跳过析构函数调用(例如不使用 RAII),那么您的非托管资源将会泄漏,并且 .NET 运行时无法对它们执行任何操作。

    如果您在终结器中清理非托管资源,那么即使您将代码弄乱并让对象引用飞到某个地方,运行时也会运行它:)

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

    【讨论】:

    • "即使你把代码弄乱了,让你的对象引用飞到某个地方,运行时也会运行它" 请注意,这不是保证,只有可能。
    • 是的。永远记住“空垃圾收集器”是一个有效的实现。 (NGC 有无限的记忆,从不费心回收任何东西。)
    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2015-10-20
    相关资源
    最近更新 更多