新的int [0]在C ++中是允许的,但是std :: allocator()。allocate(0)是否定义正确? 更笼统地说,所有分配器都必须接受0作为要分配的参数吗?
编辑: 阅读答案后,我测试了Visual Studios std :: allocator:
allocate(0)给出nullptr
deallocate(nullptr,任何东西)是nop。
因此,建议使用nullptr,但是标准不要求deallocate(nullptr,0)是nop,请参见C++ allocator::deallocate(NULL,1) allowed?
答案 0 :(得分:2)
new int[0]
的定义很明确。请注意,您需要在返回的指针上调用delete[]
,并且取消引用指针的行为是不确定的。
类似的规则适用于std::allocator().allocate(0)
:您不能取消引用返回的指针,并且需要通过调用std::allocator::deallocate
以正常方式清理内存。
允许分配器抛出std::bad_alloc
异常;您可以这样做来处理0参数的情况,而不违反标准规定的任何要求。返回nullptr
是替代方法。
答案 1 :(得分:2)
表34 — Cpp17分配器要求
已为n个类型T的对象分配了内存,但未构造对象。分配可能 引发适当的异常。174[注意:如果n == 0,则未指定返回值。 —尾注]
我会读为“分配器应/应该处理n == 0,而不是抛出并返回可能是有效指针或为nullptr
的值。”