Почему бы нам не освободить неуправляемые ресурсы в деструкторе? - PullRequest
0 голосов
/ 22 августа 2011

Согласно этой статье, http://msdn.microsoft.com/en-us/library/ms177197.aspx на MSDN, мы должны высвободить неуправляемые ресурсы в финализаторе и управляемые ресурсы в деструкторе. То есть следующий шаблон:

// 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 Ответ

2 голосов
/ 22 августа 2011

Потому что, если вы пропустите вызов деструктора (например, не используя RAII), ваши неуправляемые ресурсы будут просачиваться, и среда выполнения .NET не сможет ничего с ними поделать.

Если вы очистите свои неуправляемые ресурсы в финализаторе, то среда выполнения запустит это, даже если вы испортили свой код и позволили ссылке на ваш объект куда-то улететь:)

По сути, если ваш код содержит ошибки, вы не можете рассчитывать на вызываемый деструктор, но финализатор всегда будет вызываться, когда объект утилизируется сборщиком мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...