如果我替换所有operator new
签名,至少在我测试的实现上,我看到标准容器调用我的替换版本来分配内存。
这是否符合标准?也就是说,实现使用优化版本是不合法的,该版本没有将我的替换函数称为标准容器下的内存?
答案 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)
个字节