Allocator concept和std::allocator_traits没有说明allocate
在分配失败时会做什么 - 它会返回nullptr还是抛出?
当我使用标准分配器API编写容器时,我应该
检查返回值并在noexcept
版本成员函数中捕获异常(例如push_back
,resize
...);
检查返回值并在抛出异常的情况下抛出
所以无论它是否抛出,我都会得到正确的行为。
答案 0 :(得分:7)
C ++标准的n4659草案在23.10.9处说默认分配器[default.allocator](强调我的):
23.10.9.1分配者成员[allocator.members]
...
T* allocate(size_t n);
2返回:指向大小为n * sizeof(T)的存储数组的初始元素的指针,对齐 适用于T型物体。
3备注:存储是通过调用:: operator new(21.6.2)获得的,但在或时未指定 调用此函数的频率。
4 如果无法获取存储,则抛出:bad_alloc。
它清楚地表明,如果标准分配器无法分配存储,它将引发bad_alloc
异常。
以上是标准分配器。 20.5.3.5分配器要求[allocator.requirements]和表31 - 分配器要求包含:
中描述了对任何分配器的要求。a.allocate(n)[返回类型:] X ::指针[断言/注释/ 前置/后置条件]内存分配给n 类型为T但是对象的对象 没有建造。分配可能 扔一个合适的 例外
我的理解是allocate
只能在分配内存时返回。因此,如果无法分配内存,分配器应该抛出一个适当的异常(不一定是bad_alloc
,即使它非常合适)。