在 C++ 中使用垃圾回收有一个难点,就是要识别什么是指针,什么不是。
如果您可以调整编译器以为每种对象类型提供此信息,那么您就完成了,但如果您不能,那么您需要使用保守的方法:即扫描内存以搜索任何可能看起来像指针。这里还有“位填充”的困难,人们将位填充到指针中(高位在 64 位中大部分未使用)或对两个不同的指针进行异或以“节省空间”。
现在,在 C++0x 中,标准委员会引入了标准 ABI 来帮助实现垃圾收集。在 n3225 中,您可以在20.9.11 Pointer safety [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
但它不考虑指针算术......
最后,垃圾收集有许多策略:引用计数(使用循环检测算法)和标记和扫描是主要的不同系统,但它们有多种风格(是否生成,是否复制/压缩,...)。