【发布时间】:2018-09-26 07:00:51
【问题描述】:
我想知道这是否是未定义的行为:
#include <stdint.h>
int main() {
auto* p = new uint8_t[32];
float* c = reinterpret_cast<float*>(p);
delete[] c;
}
在standard 有
如果不是,则行为未定义。在第二种选择(删除数组)中,delete 操作数的值可能是空指针值或由先前数组 new-expression 产生的指针值。79 如果不是,则行为未定义。 [ 注意:这意味着 delete-expression 的语法必须与 new 分配的对象的类型匹配,而不是 new-expression 的语法。 ——尾注]
所以解释有点不清楚的短语
这意味着 delete-expression 的语法必须与 new 分配的对象的类型匹配,而不是 new-expression 的语法
我可以说上面是未定义的行为,对吗?
【问题讨论】:
-
您引用了错误的段落。下一段是说类型必须匹配,否则它是未定义的。
-
在您的特定情况下,未定义的行为是“无害的”(如果调用 UB 可能是无害的),因此原则上它可以被明确定义。但是想想如果析构函数不是像你的例子那样微不足道会发生什么。在这种情况下编译器应该做什么?它必须调用 some 析构函数,只有哪一个是正确的,以及它如何处理它所指的可能不正确的内存块(实际上是其他类型)?
-
请注意,您对
reinterpret_cast的使用具有实现定义的行为。在(不相关的)指针类型之间进行转换时,对齐方式可能会有所不同,例如。
标签: c++