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