Главная arrow С++ (часть 4) arrow Обзор классов сборщика мусора

Обзор классов сборщика мусора

Сборщик мусора использует четыре класса: GCPtr, Gcinfo, iter и outofRangeExc. До подробного анализа кода полезно выяснить, какую роль играет каждый из них.
О классе GCPtr
Класс GCPtr — основа сборщика мусора, он реализует указатель, предназначенный для сбора мусора. GCPtr поддерживает список, который связывает счетчик ссылок с каждым фрагментом памяти, выделенной с помощью GCPtr. Главным образом, в этом и заключается его работа. Каждый раз, когда GCPtr указывает на фрагмент памяти, счетчик ссылок, связанный с этим фрагментом, увеличивается на единицу. Если GCPtr до этого указывал на другой участок памяти, счетчик ссылок этого фрагмента уменьшается на единицу. Таким образом, добавление указателя, ссылающегося на участок памяти, увеличивает на единицу его счетчик ссылок, а удаление указателя уменьшает счетчик ссылок. Каждый раз, когда GCPtr выходит за пределы области видимости (scope), счетчик ссылок, связанный с участком памяти, на который он в данный момент указывал, уменьшается на единицу. Когда
Јqg|4H1S. WDIJUJIS. bianuDnivn (юопшм njrjirvj, vonjonnum v nriivi i^^ai iviv^n i nam-
ти можно освобождать.
ocptr — шаблонный класс, который перегружает операции указателей * и -> и операцию индексирования массива [ ]. Следовательно, GCPtr создает новый тип указателя и встраивает его в программную среду С++. Это позволяет использовать класс GCPtr в значительной степени так же, как обычный указатель языка С++. Однако по причинам, которые будут разъяснены чуть позже в этой же главе, GCPtr не перегружает операции: ++, — и другие арифметические операции, определенные для указателей. Следовательно, никаким другим способом, кроме присваивания, нельзя изменить адрес, на который объект типа GCPtr указывает. Это может показаться существенным ограничением, но это не так, потому что неподдерживаемые операции выполняются с помощью класса iter.
Для иллюстрации своей работы сборшик мусора выполняется, когда объект GCPtr выходит за пределы области видимости. В этот момент просматривается список сбора мусора и вся память с нулевыми счетчиками ссылок освобождается, даже если она не была первоначально связана с объектом GCPtr, вышедшим за пределы области видимости. Ваша программа может также явно потребовать сбора мусора, если нужно освободить память раньше.
О классе GCInfo
Как отмечалось ранее, класс GCPtr поддерживает список, связывающий счетчики ссылок с выделенной памятью. Каждый элемент этого списка инкапсулирован в объект типа Gcmfo. Класс Gcmfo хранит счетчик ссылок в поле refcount и указатель на память в поле memPtr. Таким образом, объект Gcinfo связывает счетчик ссылок с фрагментом памяти.
В Gcmfо определяются еще два поля: isArray и arraySize. Если поле memPtr указывает на динамически размещенный массив, то поле isArray становится равным true, а в поле arraySize содержится длина массива.
О классе iter
Как объяснялось ранее, объект GCPtr предоставляет вам доступ к памяти, на которую он указывает, с помощью обычных операций указателей: * и ->, но он не поддерживает арифметические операции указателей. Для этого вам следует использовать объект типа iter, iter — это шаблонный класс, функционально подобный типу iterator библиотеки STL. В нем определены все операции с указателями, в том числе и арифметические. Главная задача класса iter — обрабатывать в цикле элементы распределенного в динамической памяти массива. Этот класс также обеспечивает контроль диапазона (или проверку границ). Получить доступ к нему можно из класса GCPtr с помощью вызова функций begin о или endo, которые действуют Почти так же, как их эквиваленты из библиотеки STL.
Важно отметить, что хотя класс iter и тип iterator из библиотеки STL подобны, их нельзя считать полными аналогами и использовать один вместо другого.
О классе OutOfRangeExc
Если объект типа iter обнаруживает попытку выхода за диапазон выделенной памяти, возникает исключение типа OutOfRangeExc. Класс OutOfRangeExc не содержит членов, интересных для задачи, описываемой в этой главе. Это просто тип исключения, которое может генерироваться. Но вы вольны добавить в этот класс функциональные средства, нужные вашим приложениям.