在C ++中用allocate(0)分配零个对象

时间:2018-12-04 10:03:25

标签: c++ memory-management dynamic-memory-allocation

新的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?

2 个答案:

答案 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的值。”