自定义"::operator new"为STD容器要求特殊的分配器

Does customizing "::operator new" require special allocators for std containers?

本文关键字:quot 分配器 STD new operator 自定义      更新时间:2023-10-16

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

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

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

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

c++标准(这里来自c++ 11)规定std::allocator(用于标准容器的默认分配器):

注意:存储空间是通过调用::operator new(std::size_t)(18.6.1)来获得的,但是没有指定调用该函数的时间和频率。[…]

因此,您没有实现用于vector的特殊分配器类这一事实并不是问题。这个问题可能是由全局运算符本身的定义错误引起的,或者可能是关于您使用向量的方式。建议接下来的步骤是:

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

我认为需要实现STL分配器来控制vector的分配