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

Неуправляемые ресурсы и освобождение ранее выделенной области памяти

Класс SimpleLog поддерживает интерфейс IDisposable и таким образом реализует метод Dispose (Освободить ранее выделенную область памяти). Код, освобождающий ресурсы, просто удаляет объект streamWriter. Чтобы удостовериться в том, что для удаленного объекта также не будет вызван метод завершения, вызывается GC::SuppressFinalize. Завершающий работу объекта деструктор просто делегирует свои функции методу Dispose (Освободить ранее выделенную область памяти). Для контроля над продолжительностью жизни объекта на консоль выводится сообщение из конструктора, из метода Dispose (Освободить ранее выделенную область памяти) и из деструктора.

Вот код тестовой программы:

//DisposeDemo.h
using namespace System;
// использование пространства имен Система;
using namespace System::Threading;
// использование пространства имен
// Система::Организация поточной обработки;
public _gc class DisposeDemo
// класс сборщика мусора DisposeDemo
{ public:
static void Main()
{
SimpleLog *log = new SimpleLog("logl.txt");
log › WriteLine("First line");
// файл регистрации › WriteLine ("Первая строка");
Pause(); // Пауза
log › Dispose(); // Первое завершение файла регистрации
log › Dispose(); // файл регистрации – испытание – второй
// вызов Dispose
log = new SimpleLog("Iog2.txt");
log › WriteLine("Second line");
// файл регистрации › WriteLine ("Вторая строка");
Pause (); // Пауза log = new SimpleLog(
"Iog3.txt"); // предыдущий (2-ой) файл
// регистрации освобожден
log › WriteLine("Third line");
// файл регистрации › WriteLine ("Третья строка");
Pause (); // Пауза
log =0; // последний файл регистрации освобожден
GC::Collect();
// СБОРЩИК МУСОРА:: Собрать ();
Thread::Sleep(100);
// Поток:: Бездействие (100);
}
private: // частный
static void Pause)) // Пауза
{
Console::Write("Press enter to continue");
// Запись:: ("Нажмите ввод для продолжения");
String *str = Console::ReadLine(); // Строка
}
};

Указателю log (файл регистрации) на объект SimpleLog по очереди присваиваются три различных указателя на экземпляр объекта. Первый раз ранее выделенная область памяти освобождается должным образом. Второй раз указателю присваивается указатель на третий объект. Это происходит до освобождения ранее выделенной области памяти для второго объекта. В результате второй объект становится мусором. Используя метод Pause (Пауза) для приостановки выполнения этого консольного приложения, мы можем исследовать состояние файлов logl.txt, Iog2.txt и Iog3.txt в разные моменты выполнения программы.

Выполнение программы приводит к следующему выводу:

logfile logl.txt created First line
Press enter to continue logfile logl.txt
disposed logfile Iog2.txt created Second line
Press enter to continue logfile Iog3.txt created Third line
Press enter to continue logfile Iog3.txt
finalized logfile Iog3.txt
disposed logfile Iog2.txt
finalized logfile Iog2.txt disposed

Перевод такой:

системный журнал logl.txt создан
Первая строка
Нажмите ввод для продолжения
системный журнал log1.txt завершен
системный журнал Iog2.txt создан
Вторая строка
Нажмите ввод для продолжения
системный журнал Iog3.txt создан
Третья строка
Нажмите ввод для продолжения
системный журнал Iog3.txt завершен
системный журнал Iog3.txt освобожден
системный журнал Iog2.txt завершен
системный журнал Iog2.txt освобожден
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.