无符号的int数组分配

时间:2015-05-01 16:18:23

标签: c++ arrays memory dynamic-memory-allocation

我无法在c ++中为我的1D数组分配内存。我尝试使用malloc和new运算符。当我使用malloc时,merge的值为0。在新运算符的情况下,我获得异常std::bad_alloc at memory location ...data_length的值为131596814.我有8GB内存,而且有很多是免费的。我使用的是Visual Studio 2012,调试/发布模式对它没有影响。

unsigned int* merge = (unsigned int*) malloc(2 * data_length * sizeof(unsigned int));

unsigned int* merge = new unsigned int[data_length * 2];

我在这里做错了吗?

1 个答案:

答案 0 :(得分:3)

必须将C / C ++(和许多其他语言)中的数组分配为一个连续的内存块。

您正在尝试分配1GB块 - 如果符合x86(32位),这几乎是不可能的,特别是如果它不是第一次分配。限制来自Windows上的默认2GB地址空间(如果您的主机系统是x64并且您的进程被标记为“大地址识别”,则可以扩展到近4GB)以及由半随机位置加载的DLL导致的地址空间碎片在地址空间以及程序以前的内存分配。

修正:

  • 重新设计程序,不需要大型数组 - 分配只是第一个问题。索引(并非每种语言都支持索引的长度),增加现有数组需要完整拷贝。
  • 考虑使用提供“chunked”数组的库,这些数组将数据存储为较小块的列表,同时公开基于常规数组/迭代器的接口
  • 如果必须处理大量数据切换到x64(64位)基本上是要求,因为地址空间限制几乎消失,并且容易找到1GB的地址空间块。