当0传递给allocate
方法时,可以抛出异常吗?
谢谢。
P.S。
如果n == 0,则返回值为 未指定的。
这是否意味着allocate
不应该抛出异常?我倾向于认为如果n == 0不允许投掷,那么标准就会清楚地说出来。
答案 0 :(得分:7)
所有标准必须说(§20.1.5/ 2)是给定的
T
- 任何类型X
- 类型T
的分配器类a
- 类型X&
n
- 类型X::size_type
,如果a.allocate(n)
等于0,则表达式n
的返回值为未指定。
一方面,鉴于X::allocate
没有任何强制规范的异常规范,并明确地可能抛出std::bad_alloc
,我不明白为什么它不会抛出一些其他类型的例外。另一方面,措辞特别指出n
等于零的条件,并直接暗示 是一个返回值,这意味着你不应该抛出。我认为可能会对某些解释持开放态度,但就我个人而言,我会支持后者,并将其视为一种无与伦比的代码路径。
答案 1 :(得分:6)
标准要求大小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
为
n
类型的T
对象分配内存,但不构造对象。allocate
可能会提出适当的例外情况。 [注意:如果n == 0,则返回值未指定。 - 后注]
(强调我的。)
所以,你不应该抛出,因为某些的回报是由该笔记隐含的。但是,不需要返回1
字节大小的内存块。所以,回答你的问题:不,当实现标准兼容分配器时,当大小请求为allocate
时,不允许你引入0
。