Architecture Net



         

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


Метод Dispose (Освободить ранее выделенную область памяти) должен также вызвать метод Dispose (Освободить ранее выделенную область памяти) базового класса с целью удостовериться, что все его ресурсы тоже освобождаются. Причем и этот метод должен быть написан так, чтобы не возникала исключительная ситуация при его вызове, если ресурсы уже были освобождены.

Поскольку завершение представляет собой дорогой процесс, любой объект, который больше не будет использовать ресурсы, должен вызвать статический метод GC:: SupressFinalize, передавая ему указатель this. При наличии в коде блока try/finally можно разместить вызов метода Dispose (Освободить ранее выделенную область памяти) объекта в блоке finally (наконец), чтобы удостовериться в том, что ресурсы будут освобождены.

Пример программы DisposeDemo иллюстрирует шаблон для освобождения ресурсов. Класс SimpleLog с помощью класса StreamWriter реализует запись (информации) в файл.

//SimpleLog.h
using namespace System;
// использование пространства имен Система;
using namespace System::10;
// использование пространства имен Система::10;
public _gc class SimpleLog :
public IDisposable
// класс сборщика мусора
SimpleLog: IDisposable
{
private: // частный
StreamWriter *writer; String *name;
// Строка bool disposeCalled;
// логический (булев) флажок disposeCalled public:
SimpleLog(String *fileName) : disposeCalled(false)
// (Строка *fileName): (ложь)
{
name = fileName; // имя файла
writer = new StreamWriter(fileName, false);
// устройство записи = новый StreamWriter (имя
// файла, ложь);
writer->AutoFlush = true;
// устройство записи-> Автосброс = истина;
Console::WriteLine(
String::Format("logfile {0} created", name));
// Строка::Формат ("системный журнал (0}
// создан", имя));
}
void WriteLine(String *str) // Строка
{
writer->WriteLine(str); // запись
Console::WriteLine(str);
}
void Dispose ()
{
if(disposeCalled)
// если
(disposeCalled) - если все уже сделано
return;
writer->Close ();
GC::SuppressFinalize (this);
// СБОРЩИК МУСОРА Console::WriteLine(
String::Format("logfile {0} disposed", name));
// Строка::Формат ("системный журнал {0}
// закрыт ", имя));
disposeCalled = true;
// истина - все уже сделано
}
-SimpleLog()
{
Console::WriteLine(
String::Format("logfile {0} finalized", name));
// Строка::Формат ("системный журнал (0)
// завершен", имя));
Dispose();
}
};




Содержание  Назад  Вперед