Сборка мусора. Уничтожение объектов.
//ExplicitDelete.h using namespace System::Threading; // использование пространства имен // Система::Организация поточной обработки; public _gc class SomeClass // класс сборщика мусора SomeClass { public: – SomeClass() { Console::Write (// Запись "Destructor running in thread: {0}, ", // "Деструктор, выполняющийся в потоке: (0), ", _box(Thread::CurrentThread › GetHashCode())); // Поток Console::WriteLine( "Destroying object: {0}", // "Уничтожение объекта: {0} ", _box(this › GetHashCode())); } }; public _gc class ExplicitDelete // класс сборщика мусора ExplicitDelete { public: static void Main() { Console::WriteLine( "Main thread: {0}", // "Основной поток: {0} ", _box(Thread::CurrentThread › GetHashCode())); // Поток SomeClass *sc = new SomeClass; Console::WriteLine( "Main thread creating object: {0}", // "Основной поток, создающий объект: {0} ", _box(sc › GetHashCode())); Console::WriteLine( "Nulling pointer to object: {0}", // "Обнуление указателя на объект: {0} ", _box(sc › GetHashCode())); sc = 0; GC::Collect (); // СБОРЩИК МУСОРА:: Собрать(); GC::WaitForPendingFinalizers(); // СБОРЩИК МУСОРА sc = new SomeClass; Console::WriteLine( "Main thread creating object: {0}", // "Основной поток, создавший объект: {0} ", _box(sc › GetHashCode())); Console::WriteLine( "Deleting pointer to object: {0}", // "Удаление указателя на объект: {0} ", _box(sc › GetHashCode())); delete sc; // удалить Console::WriteLine("All done."); // Все сделано } };
Ниже приведена выдача.
Main thread: 2 Main thread creating object: 5 Nulling pointer to object: 5 Destructor running in thread: 6, Destroying object: 5 Main thread creating object: 7 Deleting pointer to object: 7 Destructor running in thread: 2, Destroying object: 7 All done.
Перевод такой:
Основной поток: 2 Основной поток, создавший объект: 5 Обнуление указателя на объект: 5 Деструктор, выполняющийся в потоке: 6, Уничтожаемый объект: 5 Основной поток, создавший объект: 7 Удаление указателя на объект: 7 Деструктор, выполняющийся в потоке: 2, Уничтожаемый объект: 7 Все сделано.
Чтобы избежать лишних накладных расходов, не стоит определять деструктор для класса, если на то нет серьезных причин. В случае, если деструктор все же реализуется, нужно, вероятно, в классе предоставить альтернативный, детерминированный механизм для выполнения необходимой очистки. Каркас .NET Framework рекомендует использовать шаблон проектирования Dispose (Освободить ранее выделенную область памяти) для детерминированной очистки, которую мы сейчас и рассмотрим.