首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中使用std::allocator::allocator(0)分配零个对象

在C++中使用std::allocator::allocator(0)分配零个对象
EN

Stack Overflow用户
提问于 2018-12-04 18:03:25
回答 2查看 482关注 0票数 6

C++中允许使用new int[0],但std::allocator<int>().allocate(0)是否定义良好?更一般的情况是,是否所有分配器都必须接受0作为要分配的参数?

编辑:在阅读了答案之后,我测试了Visual Studio的std::allocatorallocate(0)给了nullptr

deallocate(nullptr, anything)是nop。

所以使用nullptr是一个很好的建议,但是标准并没有要求deallocate(nullptr, 0)是一个nop,请参阅C++ allocator::deallocate(NULL,1) allowed?

EN

回答 2

Stack Overflow用户

发布于 2018-12-04 18:17:24

表34 - Cpp17Allocator要求

内存分配给类型为T的n个对象,但不构造对象。allocate可能会抛出适当的异常。174注意:如果n == 0,则返回值未指定。-end笔记

我会把它理解为“分配器应该/应该处理n == 0,而不是抛出和返回一个可能是有效指针或nullptr的值。”

票数 4
EN

Stack Overflow用户

发布于 2018-12-04 18:17:02

事实上,new int[0]是定义良好的。请注意,您需要在返回的指针上调用delete[],并且取消引用该指针的行为是未定义的。

类似的规则也适用于std::allocator().allocate(0):您不能取消对返回指针的引用,并且需要通过调用std::allocator::deallocate以正常的方式清理内存。

允许分配器抛出std::bad_alloc异常;您可以通过这样做来处理0参数的情况,而不会违反标准规定的任何要求。返回nullptr是另一种选择。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53610332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档