на начало
На главную страницу
Форум   

Статья :: Уничтожение объектов


Уничтожение объектов

Исключая ситуацию явного использования оператора delete (уничтожить), для управляемого объекта время разрушения недетерминировано. Деструктор для конкретного объекта, на который нет ссылок, может вызваться в любое время, когда выполняется процесс сборки мусора. Порядок вызовов деструкторов для различных объектов непредсказуем. Более того, при исключительных обстоятельствах деструктор может не вызваться совсем (например, поток войдет в бесконечный цикл или процесс завершится аварийно и тогда во время выполнения не будет возможности провести очистку). К тому же, если оператор delete (уничтожить) не используется явно, то поток, из которого будет вызван деструктор, не определен.
В примере ExplicitDelete демонстрируется, что вызов деструктора является синхронным, и поэтому детерминированным, если явно удалить управляемый указатель. Следующий код демонстрирует создание двух объектов. Первый завершается пассивно путем обнуления указателя на него. Сборщик мусора асинхронно вызывает деструктор в своем собственном потоке. Второй объект разрушается явно с помощью оператора delete (уничтожить) и деструктор вызывается синхронно. Программа с помощью хэш-кодов отображает подробности того, что случается с каждым объектом, и в каком потоке это случается. Из вывода можно увидеть, что в случае пассивно завершаемого объекта деструктор выполняется в потоке, отличном от того, в котором выполняется функция Main (Главная). И напротив, в случае явного уничтожения объекта деструктор выполняется в том же самом потоке, что и метод Main (Главный).

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


Уничтожение объектов

страницы в данном разделе 
Глава 8. Классы каркаса .NET Framework Классы каркаса .NET Framework
Метаданные и отражение Класс туре (Тип)
Динамическое связывание Ввод и вывод в .NЕТ
Потоковые классы Примитивные типы данных и потоки
TextReader И TextWriter Обработка файлов
Сериализация, или преобразование в последовательную форму Объекты сериализации
ISerializable Модель приложений .NET
Поток Изоляция потоков
Синхронизация коллекций Контекст
Заместители и заглушки ContextBoundObject
Изоляция приложений Прикладная область
Прикладные области и сборки Класс AppDomain (Прикладная область)
События AppDomain (Прикладная область) Пример AppDomain (Прикладная область)
Маршализация, прикладные области и контексты Асинхронное программирование
Асинхронные шаблоны проектирования lAsyncResult
Использование делегатов в асинхронном программировании Организация поточной обработки с параметрами
Удаленный доступ Краткий обзор удаленного доступа
Удаленные объекты Активация
Пример удаленного объекта Пример программы, реализующей удаленный доступ
Метаданные и удаленный доступ Конфигурационные файлы удаленного доступа
Программируемые атрибуты Использование самостоятельно созданного атрибута
Определение класса атрибута Определение базового класса
Сборка мусора Уничтожение объектов
Неуправляемые ресурсы и освобождение ранее выделенной области памяти Поколения
Завершение и раскручивание стека Управление сборкой мусора с помощью класса сборщика мусора GC
Программа-пример Резюме


Содержание сайта (выборка)
Apache
Протоколы TCP/IP (принципы, протоколы и архитектура)



PHP, PELR, JSP
PHP
JavaServer Pages (JSP)

Базы данных
Основы mysql
СУБД INFORMIX
СУБД POSTGRES
Основы проектирования реляционных баз данных

HTML, javascript
Спецификация HTML 4.01
Каскадные Таблицы Стилей, Уровень 2
Клиентский JavaScript. Справочник.
JavaScript руководство пользователя
Серверный JavaScript 1.4. Руководство по Использованию.

Паскаль, C, C++, C#
GCC (примеры)
FAQ Валентинa Озеровa DELPHI
C



 
© faq.pp.ru, справочник программиста