当分配失败时,C++ allocator :: allocate应该抛出还是返回nullptr?

Jia*_* Xu 3 c++ std allocator

分配器的概念标准:: allocator_traits不说什么allocate时候分配失败,会做-将它返回nullptr或抛出?

当我使用标准分配器API编写容器时,我应该

  1. 检查返回值并捕获noexcept版本成员函数中的异常(例如push_back,resize...);

  2. 检查返回值,如果在抛出异常中失败则抛出

所以无论它是否抛出,我都会得到正确的行为.

Ser*_*sta 7

针对C++标准的n4659草案在23.10.9中说默认分配器[default.allocator](强调我的):

23.10.9.1分配器成员[allocator.members]
...

T* allocate(size_t n);
Run Code Online (Sandbox Code Playgroud)

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 ::指针[断言/注释/前置/后置条件]为类型为T的n个对象分配内存,但不构造对象.allocate可以抛出适当的异常

我的理解是allocate只能在分配内存时返回.因此,bad_alloc如果无法分配内存,分配器应该抛出适当的异常(即使它非常合适也不一定).

  • @JiaHaoXu:写的是它应该返回一个指向已分配内存的指针,它可能会抛出.当无法分配时,没有提供返回空指针的规定.你是对的它不明确,但许多事情并不比C++标准更明确...... (2认同)