【发布时间】:2013-07-12 07:23:51
【问题描述】:
如果我们分配一个大小为 1 的对象,如下所示
int *arr = new int[1];
我们应该使用operator delete[] 或operator delete 删除对象吗?
我担心的原因是编译器是否足够聪明,可以将语句转换为单个元素分配int *arr = new int,这会导致调用operator delete[] UB。
用户案例:
我有一个指针,我最终会以多种方式分配它,但最终希望将其删除。所以想知道,对于单元素分配,如果我一直使用int *arr = new int[1],我是否可以一直安全地使用operator delete[]
注意
您能否请我参考标准以支持您的回答?
【问题讨论】:
-
operator delete[]当然。int[1]不是int。编译器足够智能不会转换语句。 -
标准中的相同位置告诉您在
new[]之后调用delete[]。尺寸 1 没有特殊情况。 -
如果编译器是足够聪明地做到这一点(尽管将一种类型更改为另一种与智能完全没有任何关系),它必须通知您此更改,或者必须在标准中指定此更改,在这种情况下,它也不是聪明的,而是强制性的。如果它默默地在背后,那么那个编译器并不聪明,而是故意邪恶。除了常识之外,不需要任何标准文档,
int只是 与int[1]不同。单元素数组仍然是数组吗(提示:答案隐藏在此评论中)? -
可能还值得指出的是,几乎没有已知的案例应该使用
new[]。 -
这是一个愚蠢的问题。编译器有多“聪明”并不重要,它不能引入未定义的行为(1.9 [intro.execution] p5)并要求程序员更改正确的源代码,并且您已经知道将
delete[]与@一起使用987654337@ 是正确的并且是标准要求的。 “智能”编译器的这种优化意味着程序可以在一个编译器上运行,而不是在另一个编译器上运行。那就是疯狂所在。
标签: c++