Главная arrow С++ (часть 4) arrow Подсчет ссылок

Подсчет ссылок

В этом алгоритме каждый выделенный фрагмент памяти связывается со своим счетчиком ссылок. Счетчик увеличивается на единицу каждый раз, когда добавляется ссылка на фрагмент памяти, и уменьшается на единицу, когда удаляется ссылка на связанный с ним участок памяти. В терминах С++ это значит, что каждый раз, когда указатель получает адрес этого фрагмента памяти, счетчик ссылок, ассоциированный с этой памятью, увеличивается с помощью операции инкремента. Когда указатель устанавливается для ссылки на другой участок памяти, к счетчику применяется операция декремента. Когда счетчик станет равным нулю, память превратится в неиспользуемую, и ее можно очистить.
Главное достоинство этого алгоритма — простота. Его легко понять и реализовать. Более того, он не накладывает никаких ограничений на организацию хип-области, потому что подсчет ссылок не зависит от физического размещения объекта. Алгоритм прибавляет дополнительные расходы при выполнении каждой операции с указателем, но они не велики. Основной недостаток — циклические ссылки, препятствующие очистке памяти, несмотря на то, что она уже не используется. Циклическая ссылка возникает, когда два объекта указывают друг на друга прямо или косвенно. В такой ситуации никакой счетчик ссылок не уменьшится до нуля. Было предложено несколько решений проблемы циклических ссылок, но все они увеличивают сложность и/или дополнительные потери.
 
удаление сажевого фильтра