自定义“:: operator new”是否需要std容器的特殊分配器?

时间:2013-01-02 07:51:14

标签: c++ memory-management stl

我编写了一个内存分配器来解决C ++(mingw)中默认速度的问题。

要做到这一点,我已经重载全局new和delete。我正在通过的所有请求都正确分配了正确大小的内存,但我仍然得到分段错误。这些错误似乎与矢量的使用有关。

我认为这些向量将被全局覆盖new和delete覆盖,但我可能错了。所以我要问的是我是否需要一个可以在我的内存分配器上工作的stl分配器,或者是否可能使用我忽略的全局new和delete的其他问题?

2 个答案:

答案 0 :(得分:4)

  

我认为这些向量将被全局覆盖new和delete覆盖,但我可能错了。所以我要问的是我是否需要一个可以在我的内存分配器上工作的stl分配器,或者是否可能使用我忽略的全局new和delete的其他问题?

C ++标准(此处来自C ++ 11)讲述了std::allocator(用于标准容器的默认分配器):

  

(§20.6.9/ 1)备注:存储是通过调用:: operator new(std :: size_t)(18.6.1)获得的,但是在调用此函数的时间或频率是不确定的。 [...]

因此,您没有实现与向量一起使用的特殊分配器类这一事实不是问题。问题可能是由于您对全局运算符本身的定义有误,或者可能是由于您使用向量的方式。建议的后续步骤是:

  • 检查代码是否在::operator new未被替换
  • 时有效
  • 使用调试器获取崩溃的堆栈跟踪并分析此时的堆栈,以获取崩溃中涉及的函数的线索,此时局部变量的值是什么等。

答案 1 :(得分:0)

我认为需要实施STL Allocators来控制vector的分配