C ++:请求超过2GB的内存

时间:2013-01-30 18:57:58

标签: c++ memory memory-management

我有以下代码:

#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;
    }
}

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

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

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

编辑:结果是答案是我正在使用g++ -std=c00x编译,这是32位?不确定,无论哪种方式我都改变了Makefile以删除-std标志并且编译得很好

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

All about Linux swap space

其他最好的方法是将disk space设置为,如果overcommitting值设置为关闭,则无法全部分配系统上的内存,转动overcommitting ,您可以为阵列分配所有内存空间。

overcommitting值转为

overcommitting设为/proc/sys/vm/overcommit_memory