符合标准的自定义分配器

| 将0传递给
allocate
方法时可以抛出异常吗? 谢谢。 附言   如果n == 0,则返回值为   未指定。 这是否意味着
allocate
不应抛出异常?我倾向于认为,如果在n == 0的情况下不允许抛出,则该标准将清楚地说明这一点。     
已邀请:
该标准所必须说的(第20.1.5 / 2节)就是
T
–任何类型
X
T
类型的分配器类
a
X&
类型的值
n
X::size_type
类型的值, 如果
n
等于0,则未指定表达式
a.allocate(n)
的返回值。 一方面,鉴于
X::allocate
没有任何强制性的异常规范,并且明确地可能抛出
std::bad_alloc
,所以我不明白为什么它也不能抛出其他类型的异常。另一方面,该措词专门指出了条件,其中
n
等于零,并直接暗示有返回值,这意味着您不应该抛出该值。我认为这可能需要一些解释,但我个人愿意支持后者,并认为它是非例外的代码路径。     
该标准要求大小为“ 14”的分配必须返回一个指向“ 15”字节大小Brb的存储块的指针,以查找相关的标准段落。 编辑: 首先,我只获得了C ++ 0x / 11的FDIS方便(不是在家里...),但是我相信措辞在C ++ 98/03中是相似的。 接下来,看来我错了。没有地方指出分配器应返回大小为“ 15”的存储块。我的记忆使我错了。 :(虽然,但是我在3.7.4.2 [basic.stc.dynamic.allocation] p2下找到了这个小段:   即使请求的空间大小为零,请求也可能失败。如果请求成功,则返回的值应为不同于任何先前返回的值p1的非空指针值(4.10)p0,除非随后将该值p1传递给运算符delete。解引用作为零大小请求返回的指针的效果未定义(35) 在同一站点的末尾:   35)目的是通过调用std :: malloc()或std :: calloc()来实现操作符new(),因此规则实质上是   相同。 C ++与C的不同之处在于C要求零请求以返回非null指针。 (强调我的。) 现在,FDIS在
allocate
的注释中在ments17ѭ[allocator.requirements]下说:
a.allocate(n)     X::pointer 
  已为类型为“ 2”的“ 7”个对象分配了内存,但未构造对象。
allocate
可能会引起适当的异常。 [注意:如果n == 0,则未指定返回值。 —尾注] (强调我的。) 因此,您不应该抛出该提示,因为这暗示了某些东西的返回。但是,不需要返回“ 15”字节大小的存储块。因此,回答您的问题:不,在实现标准兼容分配器时,如果大小请求为
0
,则不允许抛出
allocate
。     

要回复问题请先登录注册