微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

符合标准的自定义分配器

如何解决符合标准的自定义分配器

| 将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
。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?