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

ceo*_*ron 4 c++ memory-management stl

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

为此,我重载了全局新建和删除。我遇到的所有请求都被正确分配了正确大小的内存,但我仍然遇到分段错误。这些故障似乎与向量的使用有关。

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

jog*_*pan 5

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

C++ 标准(这里来自 C++11)说明了std::allocator(用于标准容器的默认分配器):

(§20.6.9/1) 备注:通过调用 ::operator new(std::size_t) (18.6.1) 获得存储,但未指定何时或多久调用此函数。[...]

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

  • 检查代码在::operator new没有替换的情况下是否有效
  • 使用调试器获取崩溃的堆栈跟踪并分析该点的堆栈以获取有关崩溃所涉及的函数、该点的局部变量的值等的线索。