我可以使用`operator delete []`进行单个元素数组分配吗?

Abh*_*jit 8 c++

如果我们分配一个大小为1的对象,如下所示

int *arr = new int[1];
Run Code Online (Sandbox Code Playgroud)

我们应该使用operator delete[]或删除对象operator delete吗?

我担心的原因是编译器是否足够智能将语句转换为单个元素分配int *arr = new int,这将导致调用operator delete[]UB.

用户案例:

我有一个指针,我最终会以不同的方式分配,但最终会想要删除它.所以很想知道,对于单个元素分配,如果我一直使用,我int *arr = new int[1]可以一贯安全地使用operator delete[]

注意

能否请您回复标准以支持您的答案?

CB *_*ley 13

你必须使用delete[]而不是delete.不允许编译器更改new int[1]new int.

(就像intPOD类型一样,很有可能new int并且new int[1]在封面下做同样的事情,但如果是这种情况那么delete[]on int*deleteon int*也会做同样的事情.)

ISO/IEC 14882:2011 5.3.5 [expr.delete]/2:

在第一个替代(删除对象)中,操作数的值delete可以是空指针值,指向由前一个新表达式创建的非数组对象的指针,或指向表示基础的子对象(1.8)的指针这类对象的类别(第10条).如果不是,则行为未定义.

int[1]数组对象一样,如果您尝试使用delete和不删除它delete[],则行为未定义.


Bat*_*eba 6

规则很简单:

  1. 总是平衡a new与adelete
  2. 总是平衡a new[]与adelete[]

否则你得到未定义的行为.

没有例外; 甚至new[1]必须与a平衡delete[],并且new[0]必须删除,因为编译器仍然可以保留存储.

  • IIRC,`new [0]`是不被允许的. (2认同)
  • [您可以分配一个大小为零的数组](http://stackoverflow.com/questions/6180012/array-with-size-0) (2认同)