Существует несколько стратегий автоматического управления памятью на разных платформах и языках программирования.
Два основных подхода применимы к автоматическому управлению памятью: ссылка
подсчет и сборка мусора. Они оба заслуживают изучения, хотя второй
на сегодняшний день является более мощным и общеприменимым.
(Построение объектно-ориентированного программного обеспечения Бертрана Мейера, с.301)
Подсчет ссылок (то есть shared_ptr) - один из самых простых способов автоматического управления памятью. Это довольно просто, но имеет некоторые существенные недостатки (он не может иметь дело с циклическими структурами, и у него есть издержки производительности как во времени, так и в пространстве. Для каждой операции над ссылками реализация теперь будет выполнять арифметическую операцию - и, в случае отсоединения, условная инструкция. Кроме того, каждый объект должен быть расширен дополнительным полем для хранения счетчика).
Идея первой технологии автоматического управления памятью, подсчета ссылок,
это просто. В каждом объекте мы храним количество ссылок на объект; когда
этот счет становится нулевым, объект может быть переработан.
Это решение не сложно реализовать (на уровне реализации языка). Мы
должен обновить счетчик ссылок любого объекта в ответ на все операции, которые могут создать
объект, присоедините новую ссылку к нему и отсоедините ссылку от него.
(Построение объектно-ориентированного программного обеспечения Бертрана Мейера, с.301)
Сборка мусора (ведьма используется в CLR) основана на двух основных свойствах:
Надежность : каждый собранный объект недоступен.
Полнота : будет собран каждый недоступный объект.
Основа сбора мусора
Базовый алгоритм обычно включает две фазы, по крайней мере, концептуально: отметка и
подметать. Фаза марки, начиная с начала координат, рекурсивно следует ссылкам на
пройти активную часть конструкции, пометив как достижимые все объекты, с которыми он сталкивается.
Фаза развертки пересекает всю структуру памяти, восстанавливая немаркированные элементы
и разметить все.
Как и при подсчете ссылок, объекты должны включать дополнительное поле, используемое здесь для
маркировка; но затраты пространства незначительны, так как для каждого объекта достаточно одного бита. Как будет видно при изучении динамического связывания, реализация средств O-O требует, чтобы каждый
Объект несет некоторую дополнительную внутреннюю информацию (например, его тип) в дополнение к его официальной
поля, соответствующие атрибутам генерирующего класса. Эта информация обычно
занимает одно или два слова на объект; маркировочный бит обычно можно сжать в один из
эти дополнительные слова, так что на практике нет заметных накладных расходов.
P.S. Для получения дополнительной информации о сборке мусора в CLR см. Главу 20 «CLR через C #» Джеффри Рихтера
P.S.S. Для shared_ptr в .Net нет эквивалента, потому что .Net использует сборщик мусора для автоматического управления памятью, а если вы хотите использовать подсчет ссылок - вам следует реализовать его вручную (например, для управления ресурсами).