次のコードがあります。
#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=c00x
、32ビットであるでコンパイルしていたことがわかりましたか? いずれにせよ、フラグを削除するように Makefile を変更したところ、-std
問題なくコンパイルされました。