【问题标题】:How to distinguish classes that allocate using a memory-pool如何区分使用内存池分配的类
【发布时间】:2012-03-02 15:46:55
【问题描述】:

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

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

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

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

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

作为一个简单但丑陋的解决方案,我正在考虑将我的所有 B 类类重命名为具有类似 MP 的前缀(用于内存池),所以我直观地知道 不是 将它们填充到里面一个 std::unique_ptr.

但是,最好有一种语言机制可以在编译期间发现问题,或者如果我或我的团队的其他成员不小心犯了这些类型的错误,至少会以更明显的方式死掉。

【问题讨论】:

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


    【解决方案1】:

    好吧,我在 boost 内存池中看到,有一个名为 is_from() 的函数可以判断给定内存是否来自池。话虽如此,您可以覆盖delete 运算符,您可以在其中检查内存是否来自提升内存池,这意味着仅当它不是来自池时才将其删除。如果对您有帮助,您还可以对 std::unique_ptr 使用自定义删除器。

    【讨论】:

    • +1 这种方法听起来很有希望 - 我会在沙盒中尝试一下,看看是否能正常工作
    【解决方案2】:

    你也应该覆盖operator delete

    【讨论】:

    • 不,您应该使用与分配内存的方法相反的方法。
    猜你喜欢
    • 2017-07-30
    • 2015-02-17
    • 2011-08-30
    • 1970-01-01
    • 2012-07-28
    • 2012-02-22
    • 1970-01-01
    • 2012-01-13
    • 2018-10-06
    相关资源
    最近更新 更多