是否保证C ++标准库容器调用可替换的新函数?

时间:2017-10-19 05:16:16

标签: c++ c++11 language-lawyer

如果我替换所有operator new签名,至少在我测试的实现上,我看到标准容器调用我的替换版本来分配内存。

这是否符合标准?也就是说,实现使用优化版本是不合法的,该版本没有将我的替换函数称为标准容器下的内存?

2 个答案:

答案 0 :(得分:27)

分配器感知容器(例如std::vector<T>)的默认分配器是std::allocator<T>。此类模板在标准的[default.allocator]部分中描述。根据C ++ 14中的[allocator.members] / 6:

  

通过调用::operator new(std::size_t)

获取存储空间

因此全局运营商new是您需要更换的运营商。如果您专门为operator new重载了T,那么默认分配器将使用

答案 1 :(得分:7)

  

这是否符合标准?

只要你不使用自定义分配器来创建容器的实例,我相信这是真的。

来自http://en.cppreference.com/w/cpp/memory/allocator

  

如果未提供用户指定的分配器,则std::allocator类模板是所有标准库容器使用的默认分配器。

来自http://en.cppreference.com/w/cpp/memory/allocator/allocate

  

通过调用n * sizeof(T)

为未初始化的存储分配::operator new(std::size_t)个字节