Иллюстрированный самоучитель по Architecture .NET

Сборка мусора. Уничтожение объектов.

//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 (Освободить ранее выделенную область памяти) для детерминированной очистки, которую мы сейчас и рассмотрим.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.