C /Linux:动态分配产生两个不同的错误消息



这是一个简单的C 程序,它具有大小参数,并分配了大小的整数数组。在具有32位体系结构的虚拟机上运行的Linux下,使用G 编制了程序。当该应用程序与参数(数组大小)上高于1073741823*我获得

分割故障(核心倾倒)

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

丢弃了'std :: bad_alloc'
的实例后终止调用 什么():std :: bad_alloc中止(核心倾倒)

这是代码:

/* 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))-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),然后我可以使用所有虚拟内存。

您在32位计算机上没有4千兆字节的内存。您总共有4个演出。您的程序可以访问的内容少。

您获得了具有如此巨大价值的Segfault,因为您正在创建一个非法地址。基础机械甚至没有机会尝试分配该内存。它甚至在尝试进行分配之前就进行了kaboom。

价值稍小,地址有效,但有些东西阻止您分配大量内存。您可能没有那么多的内存,或者您可能会有一个限制,从而阻止您采取那么多的内存。如果这是一个软限制,则可以提高它。如果这是一个硬限制,则需要SYS Admin特权来提高它。

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

另外,为什么您认为您可以占用所有32位地址空间?您确实有内核和其他装入内存中的东西。

带有32位系统,您可以解决4个GIB。如果您尝试分配更多,则会从系统中获得细分故障。当您分配少于4个GIB时,new会引发异常,因为它不能分配太多。还有静态数据和堆栈,可以在4个GIB地址空间中占用空间。

相关内容

  • 没有找到相关文章

最新更新