В Boehm GC отсутствует концепция слабых ссылок как таковая .Однако он не сканирует память, выделенную системой malloc
, для ссылок на управляемые объекты, поэтому указатели, хранящиеся в такой памяти, не препятствуют сбору указанного объекта.Конечно, этот подход означает, что объекты, содержащие указатели, не будут управляться сборщиком.
В качестве альтернативы может быть возможно злоупотребление GC_MALLOC_ATOMIC()
или GC_malloc_explicitly_typed()
для получения управляемого объекта, который может содержать указателидругим управляемым объектам, не мешая другим объектам собираться.Это в основном сводится к тому, что GC указывает, являются ли некоторые элементы указателями, чтобы предотвратить их сканирование.
В любом случае, вам также потребуется некоторый механизм для получения уведомления при сборе объектов со слабыми ссылками, чтобыизбегайте попыток получить к ним доступ позже.У GC есть интерфейс для регистрации обратных вызовов finalizer , которые должны быть вызваны до того, как объект будет собран, и это выглядит как ваш лучший доступный вариант для этой цели.
В целом, я думаю, что вы спрашиваетедля выполнимо, но с большим количеством DIY, вовлеченных.На высоком уровне
- используйте
GC_MALLOC_ATOMIC()
для размещения объекта-оболочки вокруг указателя на объект со слабой ссылкой.Распределение этого способа позволяет GC управлять самой оберткой без сканирования указателя в ходе анализа достижимости GC. - использовать
GC_register_finalizer
для регистрации функции финализатора, которая устанавливает указатель обертки на NULL
, когдаGC решает, что указанный объект недоступен. - пользователи оболочки обязаны проверить, является ли указатель внутри
NULL
, прежде чем пытаться разыменовать его.