如何区分使用内存池分配的类

时间:2012-03-02 15:46:56

标签: c++ memory-management boost c++11

在一个项目中,我有两种类:

  • 类型A:我使用std::unique_ptr<>
  • 管理的通常分配的类
  • 类型B:已覆盖其新内容以从boost memory pool
  • 分配内存的类

对于后者,正确的用法是调用new,像往常一样,分配一个新的实例,但永远不要调用delete。当内存池对象熄灭时,这些对象会被清除。范围。

因此,如果我在std::unique_ptr<>中意外存储了一个B类实例,我将会遇到分段错误。同样,在Type B指针上显式调用delete也是个坏主意。

我应该使用哪种C ++机制来防止这些类型的错误发生?

作为一个简单但丑陋的修复,我正在考虑将所有类型B类重命名为具有MP(用于内存池)的前缀,因此我在视觉上知道而不是将它们填入内部std :: unique_ptr&lt;&gt;。

但是,如果我或我团队的其他成员意外地犯下这些类型的错误,最好有一种语言机制可以在编译过程中发现问题,或者至少以更明显的方式死掉。

2 个答案:

答案 0 :(得分:5)

好吧,我在boost内存池中看到,有一个名为is_from()的函数,它告诉一个给定的内存是否来自池。话虽如此,您可以覆盖delete运算符,您可以在其中检查内存是否来自增强内存池,也就是说,只有当它不是来自池时才删除它。如果std::unique_ptr以某种方式帮助您,也可以使用自定义删除工具。

答案 1 :(得分:3)

您也应该覆盖operator delete