Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ЛИПО .doc
Скачиваний:
0
Добавлен:
06.12.2018
Размер:
441.86 Кб
Скачать

Деструкторы. Сборка мусора

Классы задаются в исходном коде до исполнения программы, а объекты создаются динамически, на этапе исполнения посредством операции new (как было сказано ранее). Каждый порожденный объект занимает определенный объем памяти, необходимый для хранения таких элементов, как, например, переменные экземпляра. Поскольку память ограничена, очень важно удалять из нее объекты, больше не используемые в програм­ме. Это необходимо для освобождения памяти для вновь порождаемых объектов.

Прежде чем говорить о том, как в С# освобождается память, необходимо детальнее разобраться с понятием "объект больше не используется". На самом деле это значит, что объект становится недоступным для программы, так как больше не существует ссылок на него.

Рассмотрим программу, которая демонстрирует как все ссылки на объект могут быть утрачены, и таким образом он станет недоступен.

using System;

class Account

{

}

class Bank

{

private Account bankAccount;

public void SetAccount(Account newAccount)

{

bankAccount = newAccount;

}

}

class Tester

{

public static void Main()

{

Bank bankl;

Account accountl;

Account account2;

accountl=new Account();

accountl = null;

accountl = new Account();

account2 = new Account();

accountl = account2;

bankl = new Bank();

bankl.SetAccount(new Account());

bankl = null;

}

}

Эта программа ничего не выводит на экран.

Метод Main() класса Tester иллюстрирует четыре причины, приводящих к недоступ­ности объекта.

  1. Присвоение всем ссылкам на объект значения null.

В строке: Account accountl; создается объект, ссылка на который присваивается переменной accountl. В строке accountl = null; ей присваивается значение null, и она больше не содержит указателя на исходный объект. Объект Account становится недоступ­ным, поскольку на него больше нет ссылок. Графически это выглядет следующим образом:

Account accountl

Ссылка на account1

Объект Account

a

Объект Account недоступен

ccountl = null

Ссылка на account1

null

  1. Переменной, хранящей единственную ссылку на объект, присваивается другая ссылка, и объект становится недоступным.

accountl = new Account();

account2 = new Account();

accountl = account2;

Рассмотрим этот вариант графически:

accountl = new Account();

account2 = new Account();

Ссылка на account1

Объект Account

Ссылка на account2

Объект Account

accountl = account2;

Ссылка на account1

Объект Account

Ссылка на account2

Объект Account

3. Если объект А содержит единственную ссылку на объект В, то когда А становит­ся недоступным, то же самое происходит с В.

В программе переменной bankl присваивается ссылка на новый объект Bank, Этот объект содержит ссылку на объект Account, присвоенную методом SetAccount. После выполнения строки bankl = null объект bankl больше не ссылается на объект Bank , и, значит, объект Account также становится недоступ­ным.

Если объект Account ссылался на другой объект, а тот, в свою очередь, на третий и т. д., то цепочка объектов, связанных с помощью ссылок, будет доступна до тех пор, пока доступен первый объект.

bankl = new Bank();

Ссылка на bank1

Объект Bank

ссылка

null

bankl.SetAccount(new Account());

Ссылка на bank1

Объект Bank

ссылка

Объект Account

bankl = null;

Ссылка на bank1

Объект Bank

ссылка

Объект Account

null

Рассмотрим основные задачи сборщика мусора. Для освобождения памяти от недоступных более объектов в языке С# используется механизм, поддерживаемый средой исполнения .NET и называемый сборщиком мусора (СМ).

Методика автоматического управления памятью называется сборкой мусора (СМ).

Сборщик мусора выполняет две основные функции:

  • обнаружение недоступных объек­тов;

  • восстановление занимаемой ими памяти.

Рассмотрим основные принципы СМ.

  1. Механизм CM .NET-платформы не удаляет доступные объекты.

  2. СМ .NET-платформы, автоматически обнаруживает и удаляет все недоступные объек­ты. Поэтому не следует беспокоиться о запуске или прекращении работы этой системы.

  3. Недоступный объект не удаляется сразу. Когда СМ работает, он занима­ет время процессора, которое могло бы быть потрачено на выполне­ние программы, что приводит к ее временному "замораживанию". Поэтому сбор­щик мусора должен найти баланс между освобождением памяти для новых объектов и минимальным использованием ресурсов процессора.

Сборщик мусора существует не во всех объектно-ориентированных языках программи­рования. Например, в языке C++ программист сам должен создать исходный код, обна­руживающий, когда объект становится не нужным, и запускающий специальный метод, называемый деструктором, для освобождения соответствующего блока памяти. Деструктор запускается сразу же после вызова, причем в нем могут содержаться команды освобождения и других ресурсов (файлов, сетевых соединений и т. д.). Следовательно, программирующий на C++ доста­точно жестко управляет тем, когда объект освобождает память и другие ресурсы.

О6ъявленив_двструктора::=

<Идентификатор_деструктора>()

{

<Операторы>

}

Примечание

  1. <Идентификатор_деструктора> подобно конструктору должен совпадать с иден­тификатором класса.

  2. Деструктор не имеет формальных параметров.