Неуправляемые ресурсы и освобождение ранее выделенной области памяти
Класс 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 освобожден