C++中允许使用new int[0],但std::allocator<int>().allocate(0)是否定义良好?更一般的情况是,是否所有分配器都必须接受0作为要分配的参数?
编辑:在阅读了答案之后,我测试了Visual Studio的std::allocator:allocate(0)给了nullptr
deallocate(nullptr, anything)是nop。
所以使用nullptr是一个很好的建议,但是标准并没有要求deallocate(nullptr, 0)是一个nop,请参阅C++ allocator::deallocate(NULL,1) allowed?
发布于 2018-12-04 18:17:24
表34 - Cpp17Allocator要求
内存分配给类型为T的n个对象,但不构造对象。allocate可能会抛出适当的异常。174注意:如果n == 0,则返回值未指定。-end笔记
我会把它理解为“分配器应该/应该处理n == 0,而不是抛出和返回一个可能是有效指针或nullptr的值。”
发布于 2018-12-04 18:17:02
事实上,new int[0]是定义良好的。请注意,您需要在返回的指针上调用delete[],并且取消引用该指针的行为是未定义的。
类似的规则也适用于std::allocator().allocate(0):您不能取消对返回指针的引用,并且需要通过调用std::allocator::deallocate以正常的方式清理内存。
允许分配器抛出std::bad_alloc异常;您可以通过这样做来处理0参数的情况,而不会违反标准规定的任何要求。返回nullptr是另一种选择。
https://stackoverflow.com/questions/53610332
复制相似问题