符合标准的自定义分配器

时间:2011-05-19 23:06:18

标签: c++ allocator

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

谢谢。

P.S。

  

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

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

2 个答案:

答案 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