Сборка мусора в C ++ и данные с круговой ссылкой - PullRequest
4 голосов
/ 19 декабря 2011

В настоящее время я реализую свой сборщик мусора (в C ++), используя технику подсчета ссылок.Однако существует серьезная проблема, заключающаяся в том, что, если данные имеют циклическую ссылку, они никогда не собираются, поскольку их счетчики ссылок всегда ненулевые.алгоритм развертки и т. д. Возможно ли реализовать его?И как именно они работают?

Ответы [ 2 ]

3 голосов
/ 19 декабря 2011

Это классическая проблема в сборщике мусора.Взгляните на статью Сборка мусора в Википедии , она действительно хороша в представлении различных компромиссов в дизайне сборщика мусора.«Более развитые» алгоритмы, такие как трехцветная маркировка, на самом деле довольно просты и просты в реализации.Я использовал эти инструкции для реализации сборщика трассировки для моей собственной реализации Lisp в C.

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

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

1 голос
/ 19 декабря 2011

http://www.boost.org/doc/libs/1_48_0/libs/smart_ptr/weak_ptr.htm

"Шаблон класса weak_ptr хранит" слабую ссылку "на объект это уже управляется shared_ptr. Чтобы получить доступ к объекту, Слабый_птр можно преобразовать в shared_ptr с помощью shared_ptr конструктор или блокировка функции-члена. Когда последний shared_ptr для объект уходит и объект удаляется, попытка получить shared_ptr из экземпляров weak_ptr, которые ссылаются на удаленные объект потерпит неудачу: конструктор выдаст исключение типа boost :: bad_weak_ptr, а weak_ptr :: lock вернет пустой shared_ptr. "

У вас не должно быть круговых ссылок на самом деле, но если вы работаете с дизайном, в котором вы не можете их реорганизовать (что иногда случается), попробуйте поместить слабые указатели в одном из направлений, чтобы они не предотвратить уничтожение.

...