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

Реализация сборщика мусора

Для того чтобы создать сборщик мусора с использованием алгоритма полсчета ссылок, должен быть найден способ хранения сведений об указателях, ссылающихся на каждый фрагмент динамически выделенной памяти. Однако в языке С++ нет встроенного механизма, который бы позволил одному объекту узнать о том, что другой объект на него указывает. К счастью, есть решение: вы можете создать новый тип указателя для сбора мусора. Именно такой подход будет реализован в сборщике мусора, приведенном в данной главе. Для поддержки процесса сбора мусора новый тип указателя должен уметь делать следующее:
? поддерживать список счетчиков ссылок для активных динамически размещенных объектов;
О отслеживать операции с указателями: увеличивать на единицу счетчик ссылок объекта каждый раз, когда указатель указывает на этот объект, и уменьшать значение счетчика на ту же величину, когда указатель перенаправляется на другой объект;
О освобождать те объекты, счетчики ссылок которых равны нулю.
Во всех других ситуациях, не связанных со сбором мусора, новый тип указателя должен выглядеть и вести себя как обычный указатель. Например, должны поддерживаться все типы операций над указателями, такие как * и ->.
Кроме удобного способа реализации сборщика мусора, создание специального типа указателя для очистки памяти позволяет избежать какого-либо воздействия на встроенную в язык С++ систему ее динамического распределения. Новый тип указателя будет использоваться, когда потребуется сбор мусора. Если же очистка памяти нежелательна, будут применяться обычные указатели С++. Таким образом, оба типа указателей смогут использоваться в одной и той же программе.