allocate
将 0 传递给方法时可以抛出异常吗?
谢谢你。
附言
如果 n == 0,则返回值未指定。
这是否意味着不allocate
应该抛出异常?我倾向于认为,如果 n==0 不允许投掷,那么标准会清楚地说明它。
所有标准必须说(§20.1.5/2)是给定的
T
- 任何类型X
– 类型的分配器类T
a
– 类型的值X&
n
– 类型的值X::size_type
,如果等于 0 ,则表达式a.allocate(n)
的返回值未指定。n
一方面,鉴于它X::allocate
没有任何强制性的异常规范并且明确地可能throw std::bad_alloc
,我不明白为什么它也不能抛出其他类型的异常。另一方面,该措辞明确指出了n
等于零的条件,并直接暗示有返回值,这意味着您不应该抛出。我认为它可能对某些解释持开放态度,但就我个人而言,我会支持后者,并认为它是一个普通的代码路径。
该标准要求分配大小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 随后被传递给操作员删除。取消引用作为零大小请求返回的指针的效果是未定义的。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
在实现标准兼容分配器时,你不允许投入。