【发布时间】:2013-01-14 17:16:17
【问题描述】:
我有以下代码:
#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 标志,并且编译正常
【问题讨论】:
-
您的程序是否编译为 64 位程序?您可能将其编译为 32 位程序,因此尽管它在 64 位系统上运行,但仍被限制为 ~2GB 的可寻址空间。
-
你没有使用
malloc,你使用的是new。您的代码无法针对与您的问题完全无关的问题进行编译。例如,您使用n而不定义它。你真的可以编写一个小型的自包含程序来实际编译并实际演示你的问题吗? -
哦,从
<cstddef>中检查sizeof(std::size_t)——这是一种简单的方法来查看您是在为 64 位还是 32 位系统进行编译(假设char是 8 位,并且编译器并不傻)。 -
也许它找不到足够大的连续内存块。
-
@tetris11:在 UNIX-y 系统上,您可以从命令行执行
file <name-of-your-executable>以查看它是 32 位还是 64 位。std::size_t在 64 位程序中至少应为 8,但在技术上(据我所知)它在 32 位程序中为 8 也是可行的。无论如何,你的程序在我的系统上运行良好(我没有耗尽内存),但我也在 64 位编译并且有大量可用 RAM(并且 OS X 可能会过度使用内存;我我不确定)。
标签: c++ memory memory-management