MS C++中delete [i+4] v;语句的含义及是否为微软专属语法?
delete [i+4] v; 语句语义与语法属性说明 实际语义
这是MSVC环境下的非标准数组堆内存释放写法,核心语义和标准C++的delete[] v; 一致:释放v指向的数组类型堆内存,逐个调用数组元素的析构函数后把内存归还给系统。
和标准写法的差异是:方括号里的i+4是开发者手动给编译器传的数组元素总数,编译器拿到这个值后,不会再去读堆块头部存的数组长度标记,直接按你给的数量执行析构、释放内存,在早年硬件性能差的时候能省下一丁点运行时开销。
这个写法的风险极高:如果括号里的值和数组实际分配的元素数对不上,直接触发未定义行为——值写小了会漏调析构函数,造成资源泄漏;值写大了会越界访问内存,搞坏堆结构,轻则程序崩溃,重则出现莫名其妙的内存bug。
语法属性
- 这个语法从来没有进入过任何一版正式的ISO C标准,属于微软C(MSVC)独有的历史兼容扩展,早在VS2010之前的老版本VC里就已经存在,直到VS2019等较新的MSVC版本里默认还是保留了支持,纯粹是为了兼容C标准化之前写的老旧Windows平台C++代码。
- GCC、Clang等其他主流C编译器默认完全不识别这个语法,只有在特殊配置开启MSVC兼容模式时才可能编译通过,完全不属于跨平台通用的C语法。
- 新写代码绝对不要用这种写法,统一用标准的
delete[] v;就好,既没有跨编译器兼容问题,也不会因为手动数错数组长度搞出难查的bug。
内容的提问来源于stack exchange,提问作者Jacques
相关产品推荐
相关产品推荐

