如果我们分配一个大小为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[],则行为未定义.
规则很简单:
new与adelete new[]与adelete[]否则你得到未定义的行为.
有没有例外; 甚至new[1]必须与a平衡delete[],并且new[0]必须删除,因为编译器仍然可以保留存储.