0

这是一个简单的 C++ 程序,它接受一个大小参数并分配一个该大小的整数数组。程序是在 Linux 下使用 g++ 编译的,运行在 32 位架构的虚拟机上。当使用高于 1073741823* 的参数(数组大小)调用应用程序时,我得到

分段错误(核心转储)

错误,并且值略小于我得到的值。

在抛出 'std::bad_alloc'
what() 的实例后调用终止:std::bad_alloc Aborted (core dumped)

这是代码:

/* dynamicAlloc.cpp */
#include <iostream> 
#include <stdlib.h> //for atoi
#include <cstdlib> // for rand() and srand()
#include <ctime> // for time()

using namespace std;
#define STR_LEN 256

int main(int argc, char* argv[])
{
    srand(time(0)); 

    unsigned int iArraySize = 1;
    if(argc < 2)
        return -1;

    iArraySize = atoi(argv[1]);

    int *pnValue = new int[iArraySize];
    if(pnValue == NULL)
    {
        cout << "cannot allocate array" << endl;
        return -2;
    }

    for(unsigned int iCounter = 0; iCounter < iArraySize; iCounter++)
    {
        pnValue[iCounter] = rand(); 
    }

    delete[] pnValue; 
    return 0;
}

为什么我得到两个不同的错误?

另外,如果我有一个非常大的数据,需要处理/按摩数十亿的数据,我是否必须使用数据库来处理如此大量的数据,或者是否有另一种处理大型数据集的方法?

谢谢你的阅读

*1073741823 = (2 ^ 32(位地址)) / 4(int size in byte)) - 1

更新

ulimit -a 的输出是:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3808
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3808
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Ram 大小配置为 512MB。我想既然每个程序都有它自己的虚拟页面(对于 32 位架构,我认为它是 4GB),那么我可以使用所有的虚拟内存。

4

3 回答 3

1

使用 32 位系统,您可以寻址 4 GiB。如果您尝试分配更多,则会从系统中获得分段错误。当您分配少于 4 GiB 时,new会引发异常,因为它无法分配这么多。还有静态数据和堆栈,它们占用了 4 GiB 地址空间中的空间。

于 2012-10-23T16:02:45.983 回答
1

您可以尝试ulimit -a查看当前堆大小是多少,也许还可以ulimit -s unlimited检查您的程序是否开始表现得更好?还有多少 RAM 专用于虚拟机?

另外,为什么您认为您可以占用所有 32 位地址空间?您确实在内存中加载了内核和其他内容。

于 2012-10-23T15:56:20.910 回答
1

在 32 位机器上,您没有 4 GB 的可用内存。你总共有 4 个演出。您的程序可以访问的内容少于此。

因为您正在创建一个非法地址,所以您会得到一个具有巨大价值的段错误。底层机器甚至没有机会尝试分配该内存。它甚至在尝试进行分配之前就开始了。

使用稍小的值,地址是有效的,但有些东西阻止您分配这么大的内存块。你可能没有那么多内存,或者你可能有一个限制,阻止你占用那么多内存。如果是软限制,您可以提高它。如果是硬限制,则需要系统管理员权限才能提高它。

于 2012-10-23T16:08:05.687 回答