该分配器的概念和标准:: allocator_traits不说什么allocate时候分配失败,会做-将它返回nullptr或抛出?
当我使用标准分配器API编写容器时,我应该
检查返回值并捕获noexcept版本成员函数中的异常(例如push_back,resize...);
检查返回值,如果在抛出异常中失败则抛出
所以无论它是否抛出,我都会得到正确的行为.
针对C++标准的n4659草案在23.10.9中说默认分配器[default.allocator](强调我的):
23.10.9.1分配器成员[allocator.members]
...Run Code Online (Sandbox Code Playgroud)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 ::指针[断言/注释/前置/后置条件]为类型为T的n个对象分配内存,但不构造对象.allocate可以抛出适当的异常
我的理解是allocate只能在分配内存时返回.因此,bad_alloc如果无法分配内存,分配器应该抛出适当的异常(即使它非常合适也不一定).
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |