7

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

谢谢你。

附言

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

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

4

2 回答 2

7

所有标准必须说(§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等于零的条件,并直接暗示有返回值,这意味着您不应该抛出。我认为它可能对某些解释持开放态度,但就我个人而言,我会支持后者,并认为它是一个普通的代码路径。

于 2011-05-19T23:28:07.683 回答
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 随后被传递给操作员删除。取消引用作为零大小请求返回的指针的效果是未定义的。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在实现标准兼容分配器时,你不允许投入。

于 2011-05-19T23:08:18.543 回答