符合标准的自定义分配器

pic*_*c11 7 c++ allocator

当0传递给allocate方法时,可以抛出异常吗?

谢谢.

PS

如果n == 0,则返回值未指定.

这是否意味着不allocate应该抛出异常?我倾向于认为如果n == 0不允许投掷,那么标准就会清楚地说出来.

ild*_*arn 7

所有标准都必须说(§20.1.5/ 2)

  • T - 随便哪种
  • X- 类型的AllocatorT
  • a - 类型的值 X&
  • n- 类型的值X::size_type,

表达的返回值a.allocate(n)未指定的,如果n等于0.

一方面,鉴于X::allocate没有任何强制的异常规范并明确可能抛出std::bad_alloc,我不明白为什么它也不能抛出其他类型的异常.在另一方面,措辞特别提出其中的病症n等于零,直接意味着有一个返回值,这意味着你不应该扔.我认为可能会对某些解释持开放态度,但就我个人而言,我会支持后者,并将其视为一种无异常的代码路径.


Xeo*_*Xeo 5

标准要求大小的分配0应返回指向1字节大小的内存块Brb的指针,寻找相关的标准段落.


编辑:
首先,我只得到C++ 0x/11的FDIS(不在家里......),但我相信在C++ 98/03中的措辞是相似的.

接下来,我似乎错了.没有说明分配器应返回一个大小的内存块1.我的记忆错误.:(虽然,我在3.7.4.2 [basic.stc.dynamic.allocation] p2下找到了这个小段落:

即使请求的空间大小为零,请求也可能失败.如果请求成功,则返回的值应为非空指针值(4.10)p0,与先前返回的值p1不同,除非该值p1随后传递给运算符delete.取消引用作为零大小请求返回的指针的效果是未定义的.35)

在同一站点的末尾:

35)意图是通过调用std :: malloc()或std :: calloc()来实现operator new(),因此规则基本相同.C++与C的不同之处在于要求零请求返回非空指针.

(强调我的.)

现在,FDIS在17.6.3.5[allocator.requirements] 下的一份说明中说allocate:

a.allocate(n)     X::pointer 
Run Code Online (Sandbox Code Playgroud)

n为类型的T对象分配内存,但不构造对象.allocate可能会提出适当的例外.[注意:如果n == 0,则返回值未指定. - 尾注]

(强调我的.)
所以,你不应该扔掉,因为那个笔记暗示了某些东西的回报.但是,不需要返回1字节大小的内存块.所以,回答你的问题:不,当实现标准兼容分配器allocate时,不允许在大小请求0时投入.