在C ++中使用std :: allocator :: allocate(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?
2个回答

4

表34- Cpp17Allocator要求
内存为n个类型为T的对象分配,但不构造对象。allocate可能会抛出适当的异常。174 [注:如果n == 0,则返回值未指定。—结束备注]

我理解为“分配器应处理,不应抛出异常并返回可能是有效指针或的值。”


我怀疑这与C语言的7.22.3内存管理函数的实现有关(如果不是直接继承的话):“如果请求的空间大小为零,则行为是由实现定义的:要么返回空指针,要么行为就像大小为非零值一样,但返回的指针不得用于访问对象。” - Andrew Henle

3

new int[0] 是被明确定义的。请注意,你需要调用 delete[] 删除返回的指针,并且对指针的解引用行为是未定义的。

类似的规则也适用于 std::allocator().allocate(0):你无法对返回的指针进行解引用操作,需要通过调用 std::allocator::deallocate 来正常地清理内存。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接