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

C++ 如何区分使用内存池分配的类,c++,memory-management,boost,c++11,C++,Memory Management,Boost,C++11,在一个项目中,我有两类课程: 类型A:我使用std::unique\u ptr 类型B:其新属性已被重写以从中分配内存的类 对于后者,正确的用法是像往常一样调用new来分配一个新实例,但决不调用delete。当内存池对象超出范围时,这些对象将被清除 因此,如果我意外地将类型B实例存储在std::unique_ptr中,我将得到一个分段错误。同样,在类型B指针上显式调用delete也不是一个好主意 强>应该使用什么样的C++机制来防止这些类型的错误发生? < /P> 作为一个简单但丑陋的修复,

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

  • 类型A:我使用
    std::unique\u ptr
  • 类型B:其新属性已被重写以从中分配内存的类
对于后者,正确的用法是像往常一样调用new来分配一个新实例,但决不调用delete。当内存池对象超出范围时,这些对象将被清除

因此,如果我意外地将类型B实例存储在
std::unique_ptr
中,我将得到一个分段错误。同样,在类型B指针上显式调用delete也不是一个好主意

<>强>应该使用什么样的C++机制来防止这些类型的错误发生?<强> < /P> 作为一个简单但丑陋的修复,我正在考虑将我的所有类型B类重命名为具有类似MP(内存池)的前缀,这样我就可以直观地知道不要将它们塞进std::unique_ptr中


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

您也应该覆盖
操作符delete

我在boost内存池中看到,有一个名为
is_from()
的函数,它告诉您给定的内存是否来自池。话虽如此,您可以覆盖
delete
操作符,在该操作符中,您可以检查内存是否来自boost内存池,这意味着仅当它不来自池时才将其删除。如果自定义删除程序对您有所帮助,您也可以使用自定义删除程序。

+1这种方法听起来很有希望-我将在沙箱中试用,看看是否能正常工作。不,您应该使用与分配内存方法相反的方法。