C++ 符合标准的自定义分配器

C++ 符合标准的自定义分配器,c++,allocator,C++,Allocator,将0传递给allocate方法时是否可以引发异常 多谢各位 附言 如果n==0,则返回值为 未指明 这是否意味着allocate不应引发异常?我倾向于认为,如果n==0不允许抛出,那么标准会清楚地说明这一点。标准要求大小0的分配应返回指向1字节大小的内存块的指针,Brb,以查找相关的标准段落 编辑: 首先,我手头只有C++0x/11的FDI(不是在家里…),但我相信C++98/03中的措辞是类似的 其次,似乎我错了。没有规定分配器应返回大小为1的内存块。我记错了(尽管如此,我还是在3.7.4.

将0传递给
allocate
方法时是否可以引发异常

多谢各位

附言

如果n==0,则返回值为 未指明


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

标准要求大小
0
的分配应返回指向
1
字节大小的内存块的指针,Brb,以查找相关的标准段落


编辑
首先,我手头只有C++0x/11的FDI(不是在家里…),但我相信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()实现运算符new(),因此规则基本上是 同样的C++与C的不同之处在于要求零请求返回非空指针。

(我的重点。)

现在,FDI在
17.6.3.5
[allocator.requirements]下的
allocate
注释中指出:

a.allocate(n)     X::pointer 
内存分配给类型为
T
n
对象,但未构造对象<代码>分配可能引发适当的异常[注意:如果n==0,则返回值未指定。-结束注意]

(我的重点。)

所以,你不应该扔东西,因为那张纸条暗示着某种东西的回报。但是,不需要返回
1
字节大小的内存块。因此,为了回答您的问题:不,在实施符合标准的分配器时,当大小请求为
0
时,不允许您加入
allocate

标准必须说明的所有内容(§20.1.5/2)都是给定的

  • T
    –任何类型
  • X
    –类型
    T
  • a
    –类型为
    X&
  • n
    –类型为
    X::size\u type
    的值
如果
n
等于0,则表达式
a.allocate(n)
的返回值未指定


一方面,考虑到
X::allocate
没有任何强制的异常规范,并且显式地可能抛出
std::bad_alloc
,我不明白为什么它不能抛出其他类型的异常。另一方面,该措辞特别指出了
n
等于零的条件,并直接暗示存在返回值,这意味着您不应该抛出。我认为它可能适用于一些解释,但我个人会支持后者,并认为它是一条不寻常的代码路径。

对于分配器来说,在零长度分配上抛出一个异常并不是标准的。该标准不允许抛出异常,但也不要求返回内存块。特别是在第20.1.5节“分配器要求”中的表32“分配器要求”中,“分配(n)/allocate(n,u)的描述有一个注释:[注:如果n==0,则返回值未指定],因此一致性实现可以返回一个1字节的块,或者一个空指针,或者基本上任何其他东西,只要它是由编译器供应商记录的。@DavidRodríguez:它需要被批准吗?标准没有以任何方式提及它,但是
Allocator::allocate
已经可以抛出并且
Allocator::allocate
没有异常规范。@Xeo:我读过它;它表示,“C++实现通过全局分配函数提供了对动态存储的访问和管理;”代码< >代码> >运算符new [] /代码>和全局分配功能>代码>操作符删除< /代码>和<代码>操作符删除[]/Calp>。“,因此我认为它只适用于
new
new[]
@ildjarn:关于它是否可以/应该抛出,我对标准的这一部分不是专家,我理解返回值是未指定的,因为必须有一个返回值,在出现异常的情况下不会有返回值。重读同一块(这次没有那么累,也不是从一个条上)它允许在allocate中抛出异常:内存被分配给类型为T的n个对象,但对象没有被构造。allocate可能引发适当的异常。结果是一个随机访问迭代器[注意:如果n==0,返回值未指定]。现在,在标准的其他部分中,我刚刚发现您是对的。在3.7.3.1/2中,处理分配函数(不完全是分配器,但我想这两个模型都是同一个问题)的标准是明确的,对0大小内存的请求可能会失败(即,如果异常规范不是空的,则抛出异常):即使请求的空间大小为零,请求也可能失败。整段文字太长,无法复制到这里。谢谢。我知道n==0的返回值未指定,但不确定是否引发异常。