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

时间:2018-05-14 09:00:57

标签: c++ std allocator

Allocator conceptstd::allocator_traits没有说明allocate在分配失败时会做什么 - 它会返回nullptr还是抛出?

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

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

  2. 检查返回值并在抛出异常的情况下抛出

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

1 个答案:

答案 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,即使它非常合适)。