You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将std::byte数组转short*后delete[]是否为C++未定义行为?

问题解答

这段代码确实属于未定义行为,和有没有析构函数完全没关系。

C++标准对delete[]的使用有明确要求:传给delete[]的指针,必须是之前通过new[]分配时返回的原始指针,且指针类型要和new[]分配的数组元素类型匹配(或为可隐式转换的兼容类型)。

你的代码里,new std::byte[10]返回的是std::byte*类型的指针a,通过reinterpret_cast转成short*类型的b后调用delete[] b,完全违反了标准规则——b的类型和分配时的元素类型std::byte不匹配,也不是new[]返回的原始指针类型。

别拿汇编的无类型思维套C++,哪怕当前平台下运行没出问题,这也是标准不保障的行为。不同编译器、内存分配器的实现可能因此出现堆损坏、内存泄漏甚至程序崩溃的情况。

内容的提问来源于stack exchange,提问作者Chameleon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:42:01