2

我有以下代码:

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

typedef uint64_t     Huge_num;  // 8 bytes
typedef Huge_num *   Huge_Arr; // Array of 8 byte elements

using namespace std;

// Function: Return a huge array
static Huge_Arr* requestMem(int n)
{
   cout << "requesting :" 
        << (sizeof(Huge_num)*n)/(1024*1024*1024) 
        << "GB" << endl;

   Huge_Arr *buff;
   try {
      buff = new Huge_Arr[n];
   }
   catch (bad_alloc){
      cout << "Not enough mem!" << endl; 
      exit(-1);
   }
   return buff;
}

// Main
int main(){
    for (int i=1; i< 10; i++){
         Huge_Arr *mem = requestMem(i*90000000);
         delete mem;
    }
}

bad_alloc()由于某种原因,malloc 在抛出错误之前只能获取不超过 2GB 的内存。

我知道在 32 位系统上,最大地址空间确实在 2GB 的相同数量级。

但我使用的是 Ubuntu 12.04 x86_64,它应该能够处理更大的内存请求,对吧?

编辑:原来答案是我正在用g++ -std=c00x32 位编译?不确定,无论哪种方式,我都更改了 Makefile 以删除-std标志,并且编译得很好

4

2 回答 2

5

malloc正在分配连续的内存。您获得badalloc请求的 2 GB 内存这一事实并不一定意味着您的可用内存少于 2 GB,也可能意味着可用内存是碎片化的。如果您想测试在您的系统上可以分配多少内存,请尝试分配较小的块。

于 2013-01-30T19:06:06.520 回答
2

如果您增加了swap space大小,则可能有更多空间用于分配,当RAM没有足够的内存时,操作系统会heap space通过交换来增长disk space,因此您可能会更改交换文件的大小,这个链接最好地解释它:

关于 Linux 交换空间

其他最好的方法是打开overcommittingvalue 如果overcommittingvalue 设置为off,你不能在你的系统上分配所有的内存,打开valueovercommitting你可以为你的数组分配所有的内存空间。

overcommitting值转为on

设置/proc/sys/vm/overcommit_memory0

于 2013-01-30T19:56:45.530 回答