2012-03-02 46 views
4

在一个项目中的类,我有两种类:一种是如何区分分配使用一个内存池

  • 类型:我std::unique_ptr<>
  • B类管理通常分配类:类,它们的新已覆盖从boost memory pool

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

因此,如果我不小心将类型B实例存储在std::unique_ptr<>中,则会出现分段错误。同样,在类型B指针上显式调用delete也是一个坏主意。

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

举一个简单的,但丑陋的修复,我想重新命名我所有的B型班有一个像MP(内存池)的前缀,让我直观地理解到他们的东西一个std内: :unique_ptr <>。

但是,如果我有一个语言机制可以在编译过程中发现问题,或者至少在我或其他团队成员偶然犯这类错误时以更明显的方式死亡,那将是非常可取的。

回答

5

那么,我看到在boost内存池中,有一个函数叫做is_from(),它告诉给定的内存是否来自池中。话虽如此,你可以覆盖delete运算符,在那里你可以检查内存是否来自boost内存池,意味着只有当它不在池中时才删除它。如果以某种方式帮助您,您还可以使用定制删除程序std::unique_ptr

+1

+1此方法听起来很有希望 - 我会在沙盒中试用这个方法,看看我能否使用它 – kfmfe04 2012-03-02 16:00:23

3

你也应该覆盖operator delete

+0

不,您应该使用与您用来分配内存的方法相反的方法。 – 2012-03-02 16:09:39