VS2015 x64下使用new创建超2GB对象时内存分配异常问题咨询
VS2015 x64 Release模式下new分配超2GB对象的内存大小异常问题
在Visual Studio 2015的x64 Release配置中,使用new创建单个大小超过2GB(0x7FFFFFFF字节)的对象时,传递给operator new的内存大小参数出现异常。从生成的汇编代码可以确认,该问题由编译器行为导致。
示例代码与汇编输出
C++代码
struct chunk1MB { char data[1024 * 1024]; }; class chunk1 { chunk1MB data1[1024]; chunk1MB data2[1023]; char data[1024 * 1024 - 1]; }; class chunk2 { chunk1MB data1[1024]; chunk1MB data2[1024]; }; auto* ptr1 = new chunk1; auto* ptr2 = new chunk2;
对应汇编代码
auto* ptr1 = new chunk1; 00007FF668AF1044 mov ecx,7FFFFFFFh 00007FF668AF1049 call operator new (07FF668AF13E4h) auto* ptr2 = new chunk2; 00007FF668AF104E mov rcx,0FFFFFFFF80000000h // 预期应为080000000h 00007FF668AF1055 mov rsi,rax 00007FF668AF1058 call operator new (07FF668AF13E4h)
问题分析
这是Visual Studio 2015的已知编译器bug,并非设计限制。
原因在于:VS2015的x64编译器在计算超过32位有符号整数最大值(0x7FFFFFFF)的对象大小时,错误地将该值进行了符号扩展——把原本应作为无符号处理的0x80000000(2GB),转换成了64位有符号整数的负数表示0xFFFFFFFF80000000,导致传递给operator new的参数完全错误。
这个bug在Visual Studio 2017及后续版本中已经被官方修复,升级编译器版本即可解决该问题。
内容的提问来源于stack exchange,提问作者이종명
相关产品推荐
相关产品推荐

