【问题标题】:Toy Garbage Collection: Is operator new/delete enough?玩具垃圾收集:操作员新/删除是否足够?
【发布时间】:2013-11-28 08:59:57
【问题描述】:

我正在研究我的一个学习项目(使用 C 语言),并考虑将其迁移到 C++ 以获得额外的学习点。它的一部分涉及一个针对特定对象系列的垃圾收集系统,在 C 中,我通常会使用一个大的 malloc/mmap 来实现,并使用一个简单的标记和清除(我可以识别引用和类似的东西)已经)。

我的问题是我正在考虑将这个想法转移到 C++ 中,但对我对其内存管理方案的理解感到不够安全。

到目前为止,我考虑分配一个大内存池并在基类上重载运算符 new 和 delete 以调用我的内存池的抓取/释放函数,然后让垃圾收集器的扫描阶段删除它看到的对象。够了吗?我在这里没有看到的隐藏陷阱是什么?

编辑:澄清一下,我已经能够计算出分配对象的寿命,所以不需要使用 gc abi。这些对象很少被 c++ 代码操作,使用它们的代码能够通知 gc 它们正在被使用,而无需检查堆栈。

【问题讨论】:

  • 您可能想阅读 Bjarne Stroustrup 的 cmets 作为起点:stroustrup.com/C++11FAQ.html#gc-abi 它也有指向 Hans Boehm 页面的链接,所以我认为这是一个很好的起点。

标签: c++ garbage-collection new-operator


【解决方案1】:

如果您要更改类,为什么不让它们从新的基类继承,该基类在构造期间注册到 GC,而在销毁期间取消注册。经理班将做簿记。 基类可以是模板:

template <class parent> class BASE_GC {
    BASE_GC() {  /* register address and name*/}
    ~BASE_GC() {  /* unregister*/}
};

父类名可以从typeid(*this).name()派生。由于基类名称包含父名称。

【讨论】:

  • 这确实可以满足我的所有需求。如果我决定使用不同的分配器来处理不同的分配策略,而不是简单地进行 GC 簿记,那么仅覆盖运算符 new 和 delete 会不会有任何冲突?然后,如果我最终覆盖 operator new 和 delete,那么将 GC 簿记保留在构造函数/析构函数而不是内存运算符上是否有意义?
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2011-07-24
  • 2012-03-24
  • 1970-01-01
  • 2011-09-29
  • 2012-04-09
相关资源
最近更新 更多