我想知道这是否是未定义的行为:
#include <stdint.h>
int main() {
auto* p = new uint8_t[32];
float* c = reinterpret_cast<float*>(p);
delete[] c;
}
Run Code Online (Sandbox Code Playgroud)
在标准中 有
如果不是,则行为未定义.在第二个替代(删除数组)中,delete的操作数的值可以是空指针值或由前一个数组new-expression 79产生的指针值.如果不是,则行为是未定义的.[注意:这意味着delete-expression的语法必须与new分配的对象的类型匹配,而不是new-expression的语法. - 结束说明]
所以解释一些有点不清楚的短语
这意味着delete-expression的语法必须与new分配的对象的类型匹配,而不是new-expression的语法
我可以说上面是未定义的行为,对吗?
Bat*_*eba 21
是的,行为未定义.
传递给的指针delete[]必须与您从中获取的指针的类型相同new[].
请注意,对于delete和new,delete允许提交的指针与多态相关.
是的,确实是Undefined Behavior中的代码.短语意味着当你重写它时它仍然是UB
int main() {
void* p;
{
using T = uint8_t;
p = new T [32];
}
{
using T = float;
T* c = reinterpret_cast<float*>(p);
delete[] c; // The behaviour is still undefined.
}
}
Run Code Online (Sandbox Code Playgroud)
IOW,这些类型确实必须完全匹配,而不仅仅是名称.
| 归档时间: |
|
| 查看次数: |
1177 次 |
| 最近记录: |