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

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,提问作者이종명

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:35:10