Существует одна сложность использования сборки мусора в C ++, это определить, что является указателем, а что нет.
Если вы можете настроить компилятор для предоставления этой информации для каждого типа объекта, то все готово, но если вы не можете, то вам нужно использовать консервативный подход: это сканирование памяти в поисках любого шаблона, который может выглядеть как указатель Здесь также есть сложность «вставки битов», когда люди вставляют биты в указатели (старшие биты в основном не используются в 64-битном формате) или XOR два разных указателя для «экономии места».
Теперь в C ++ 0x Комитет по стандартизации ввел стандартный ABI, чтобы помочь в реализации сборки мусора. В n3225 вы можете найти его в 20.9.11 Безопасность указателя [util.dynamic.safety] . Это предполагает, что люди будут реализовывать эти функции для своих типов, конечно:
void declare_reachable(void* p); // throw std::bad_alloc
template <typename T> T* undeclare_reachable(T* p) noexcept;
void declare_no_pointers(char* p, size_t n) noexcept;
void undeclare_no_pointers(char* p, size_t n) noexcept;
pointer_safety get_pointer_safety() noexcept;
При реализации он позволит вам подключить любую схему сбора мусора (определяющую эти функции) к вашему приложению. Конечно, это потребует некоторой работы, чтобы обеспечить эти операции там, где они необходимы. Одним из решений может быть простое переопределение new
и delete
, но оно не учитывает арифметику указателей ...
Наконец, существует множество стратегий для сбора мусора: подсчет ссылок (с алгоритмами обнаружения циклов) и Mark And Sweep - это основные разные системы, но они бывают разных типов (поколение или нет, копирование / сжатие или нет, .. .).