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

为何带数值的delete运算符仅在MSVC环境中可正常运行?

为什么这段带非整数数组大小的delete[]代码仅能在MSVC中运行?

先看你给出的代码:

int main() 
{
    int* ptr = new int[14];
    delete[47.55F] ptr;
    return 0;
}

核心原因:这是MSVC的非标准扩展

标准C++里,delete[]的语法规则非常明确:方括号[]只是用来区分单对象释放和数组释放的标记,方括号内部不允许填写任何表达式或数值——正确的写法只能是delete[] ptr;。

那MSVC为什么允许这种奇怪的写法?这是微软给自家编译器加的非标准特性:

  • 它把方括号里的数值当成一个“冗余提示”,理论上用来告诉编译器数组的大小,但实际上完全没用——因为new[]分配数组时,会在堆内存的元数据里记录数组的真实大小,delete[]释放时会直接读取这个元数据,根本不会用你填的47.55F。
  • 甚至MSVC还放宽了类型限制,允许你填浮点数,它会自动把浮点数转成整数(比如47.55F会被转成47),但这个转换后的数值依然不会影响内存释放的过程。

为什么找不到对应的重载?

因为这根本不是标准的运算符重载。标准C里不存在接受这种参数的delete[]运算符,整个语法都是MSVC私有的扩展逻辑,其他编译器(比如GCC、Clang)都会直接报语法错误,因为它们严格遵循C标准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:52:04