2012-04-06 2 views
8

Что такое подсчет ссылок? В частности, что это такое для C++? Каковы проблемы, с которыми мы можем столкнуться, если мы их не будем обрабатывать? Требуется ли для всех языков подсчет ссылок?Что именно подсчет ссылок в C++ означает ?,

+2

Начните читать [здесь] (http://www.gotw.ca/gotw/043.htm). – Xeo

+1

«Подсчет ссылок - это общая оптимизация (также называемая« ленивая копия »и« копирование при записи »)». - Трава Саттер. WTF? Подсчет ссылок определенно * не * совпадает с «ленивой копией» или «копировать при записи». Подсчет ссылок (обычно) для управления памятью. Это не оптимизация. –

+0

[wikipedia page on reference counting] (http://en.wikipedia.org/wiki/Reference_counting) - довольно хорошее введение в тему. –

ответ

0

Сбор мусора ссылок - это мощный метод управления памятью, который помогает предотвратить случайное или многократное удаление объектов. Этот метод не ограничивается кодом C++ и, несмотря на его имя, не связан с концепцией ссылочных переменных C++. Скорее, этот термин означает, что мы поддерживаем подсчет всех «владеющих ссылок» на объект и удаляем объект, когда этот счет становится равным нулю.

1

Подсчет ссылок - простой, но не полный подход к обнаружению мусора.

Когда счетчик достигнет нуля, вы можете освободить этот объект.

НО если больше нет используемых объекты, ссылающиеся друг на друг циклического, они никогда не будут освобождены

Рассмотрят Ссылки на б, б ссылки а, но ничего ссылка а или б. ссылка счет на a и b будет по-прежнему 1 (= используется)

+2

Строго говоря, вы не «собираете мусор», когда у вас есть ресурсы с подсчетом ссылок, так как нет мусора. Мусор - это то, что вы получаете * после * все ссылки были потеряны. C++ вообще не производит мусор. (В отличие от программистов на C++ *, возможно.) –

+0

Правильно, поэтому я использовал термин «мусор» DETECTION –

+0

Это не «мусор», хотя! –

-2

Ссылка подсчета - позволяет использовать метафору.

У вас есть ухо. Вы хотите, чтобы он вернулся в какой-то момент.

Вы получаете группу людей, указывающих на ухо. Вы считаете их, как только они указывают.

Когда число обращается в ноль - оно просто ваше, и вы можете делать с ним, как хотите.

I.e. выньте его из уравнения (освободите его обратно в память).

BTW. Циркулярные вещи сложно обнаружить.

+3

«У вас есть ухо, вы хотите его в какой-то момент». Ну, у меня уже есть это, не нужно его возвращать. Это тоже мое ухо, когда дюжина людей указывает на это. Недостающая метафора. – Evert

7

Что такое подсчет ссылок? В частности, что это такое для C++?

Простыми словами, подсчет ссылок означает подсчет ссылок на объект.

Как правило, в C++ используется метод RAII. В этом случае способность управлять освобождением объекта типа привязана к самому типу объекта. Это означает, что пользователю не нужно явно управлять временем жизни объекта и его освобождением явно. Функциональность для этого управления встроена в сам объект.

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

Каковы проблемы, с которыми мы можем столкнуться, если мы не будем их обрабатывать?

Это означало бы не более RAII, а также бесконечное и часто ошибочное ручное управление ресурсами.
В коротких кошмарах программирования.

Нужны ли для всех языков подсчет ссылок?

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

Смежные вопросы