自定义"::operator new"为STD容器要求特殊的分配器
Does customizing "::operator new" require special allocators for std containers?
我编写了一个内存分配器来解决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
的分配
相关文章:
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 将 std::allocate_shared 与多态资源分配器一起使用
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 使用 std::分配器在 constexpr 中进行默认初始化
- 使用不兼容的分配器复制分配无序列图
- C++:矢量分配器行为、内存分配和智能指针
- 是否可以使用分配器对象来释放另一个分配器分配的内存?
- 使用模板化分配器和对向量进行排序的函数
- C++ 中的分配器错误
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 通过引用传递向量是请求 std::分配器
- 为什么这个分配器不适用于"std::allocate_shared"?奇怪的模板替换错误
- 为什么 std::vector 使用 std::分配器而不是运算符 new 和 delete?
- C++自定义分配器大小参数作为模板参数会引发编译器错误
- 在分配器中销毁元素时,C++会导致双重释放<string>?
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- c++ 中的自定义分配器,用于不调用secure_string实现
- 是否允许分配器构造和销毁成员函数从内部逻辑引发异常?
- 我可以对 std::array 使用自定义分配器来获取安全加密密钥吗?