无符号整数数组分配
Unsigned int array allocation
我无法在 C++ 中为我的一维数组分配内存。我尝试使用 malloc 和 new 运算符。当我使用 malloc 时,merge
的值为 0。如果是新运算符,我会得到异常 std::bad_alloc at memory location ...
。 data_length
的值为 131596814。我有 8GB 内存,其中很多都是免费的。我正在使用 Visual Studio 2012 并且 Debug/Release 模式不影响它。
unsigned int* merge = (unsigned int*) malloc(2 * data_length * sizeof(unsigned int));
unsigned int* merge = new unsigned int[data_length * 2];
我是不是做错了什么?
C/C++(以及许多其他语言)中的数组必须分配为一个连续的内存块。
您正在尝试分配 1GB 块 - 如果符合 x86(32 位),这几乎是不可能的,特别是如果它不是第一次分配。该限制来自 Windows 上的默认 2GB 地址 space(如果您的主机系统是 x64 并且您的进程标记为 "large address aware",则可以扩展到近 4GB)和地址 space 由在地址 space 的半随机位置加载的 DLL 以及程序先前的内存分配引起的碎片。
修复:
- 重新设计程序以不需要巨大的数组 - 分配只是那里的第一个问题。索引(并非每种语言都支持 long for 索引),增加现有数组需要完整副本。
- 考虑使用提供 "chunked" 数组的库,这些数组将数据存储为较小块的列表,同时公开基于 array/iterator 的常规接口
- 如果您必须处理大量数据切换到 x64(64 位)基本上是必需的,因为地址 space 限制实际上消失了,而且 1GB 地址块 space 很容易找到。
我无法在 C++ 中为我的一维数组分配内存。我尝试使用 malloc 和 new 运算符。当我使用 malloc 时,merge
的值为 0。如果是新运算符,我会得到异常 std::bad_alloc at memory location ...
。 data_length
的值为 131596814。我有 8GB 内存,其中很多都是免费的。我正在使用 Visual Studio 2012 并且 Debug/Release 模式不影响它。
unsigned int* merge = (unsigned int*) malloc(2 * data_length * sizeof(unsigned int));
unsigned int* merge = new unsigned int[data_length * 2];
我是不是做错了什么?
C/C++(以及许多其他语言)中的数组必须分配为一个连续的内存块。
您正在尝试分配 1GB 块 - 如果符合 x86(32 位),这几乎是不可能的,特别是如果它不是第一次分配。该限制来自 Windows 上的默认 2GB 地址 space(如果您的主机系统是 x64 并且您的进程标记为 "large address aware",则可以扩展到近 4GB)和地址 space 由在地址 space 的半随机位置加载的 DLL 以及程序先前的内存分配引起的碎片。
修复:
- 重新设计程序以不需要巨大的数组 - 分配只是那里的第一个问题。索引(并非每种语言都支持 long for 索引),增加现有数组需要完整副本。
- 考虑使用提供 "chunked" 数组的库,这些数组将数据存储为较小块的列表,同时公开基于 array/iterator 的常规接口
- 如果您必须处理大量数据切换到 x64(64 位)基本上是必需的,因为地址 space 限制实际上消失了,而且 1GB 地址块 space 很容易找到。