C++/Linux:动态分配产生两条不同的错误消息 这里是一个简单的C++程序,它采用大小参数并分配一个整数数组。该程序是在32位体系结构的虚拟机上运行的Linux下使用g++编译的。 当应用程序在参数(数组大小)高于1073741823*的情况下调用时,我得到
分段故障(堆芯转储) 错误,其值略小于我得到的值 在抛出“std::bad_alloc”的实例后终止调用C++/Linux:动态分配产生两条不同的错误消息 这里是一个简单的C++程序,它采用大小参数并分配一个整数数组。该程序是在32位体系结构的虚拟机上运行的Linux下使用g++编译的。 当应用程序在参数(数组大小)高于1073741823*的情况下调用时,我得到,c++,linux,segmentation-fault,C++,Linux,Segmentation Fault,分段故障(堆芯转储) 错误,其值略小于我得到的值 在抛出“std::bad_alloc”的实例后终止调用 what():std::bad_ALOC中止(内核转储) 代码如下: /* dynamicAlloc.cpp */ #include <iostream> #include <stdlib.h> //for atoi #include <cstdlib> // for rand() and srand() #include <ctime> /
what():std::bad_ALOC中止(内核转储) 代码如下:
/* 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;
}
Ram大小配置为512MB。我想既然每个程序都有自己的虚拟页面(对于32位arch,我想是4GB),那么我就可以使用所有的虚拟内存了。你能试试
ulimit-a
看看当前的堆大小是多少,也许还有ulimit-s unlimited
,然后检查你的程序是否开始运行得更好了?还有多少RAM专用于虚拟机
还有,为什么您认为您可以占用所有32位地址空间?您确实在内存中加载了内核和其他内容。您是否可以尝试
ulimit-a
查看当前堆大小以及ulimit-s unlimited
,然后检查您的程序是否开始运行得更好?还有多少RAM专用于虚拟机
还有,为什么您认为您可以占用所有32位地址空间?内存中确实加载了内核和其他内容。对于32位系统,您可以寻址4gib。如果您试图分配更多,则系统会出现分段错误。当分配少于4 GiB时,
new
抛出异常,因为它无法分配这么多。还有静态数据和堆栈,它们占用4Gib地址空间。对于32位系统,您可以寻址4Gib。如果您试图分配更多,则系统会出现分段错误。当分配少于4 GiB时,new
抛出异常,因为它无法分配这么多。还有静态数据和堆栈,它们会占用4Gib地址空间。在32位机器上,您没有4G的可用内存。你总共有4个gig。您的程序可以访问的内容少于此
由于创建了非法地址,因此您会得到一个具有如此巨大价值的segfault。底层机器甚至没有机会尝试分配内存。它甚至在试图进行分配之前就停止了
如果值稍小,则地址是有效的,但某些因素阻止您分配如此大的内存块。您可能没有那么多内存,或者您可能有一个限制,阻止您占用那么多内存。如果是软限制,你可以提高它。如果是硬限制,您需要系统管理员权限来提高它。在32位机器上,您没有4 GB的可用内存。你总共有4个gig。您的程序可以访问的内容少于此 由于创建了非法地址,因此您会得到一个具有如此巨大价值的segfault。底层机器甚至没有机会尝试分配内存。它甚至在试图进行分配之前就停止了
如果值稍小,则地址是有效的,但某些因素阻止您分配如此大的内存块。您可能没有那么多内存,或者您可能有一个限制,阻止您占用那么多内存。如果是软限制,你可以提高它。如果这是一个硬限制,您需要系统管理员权限来提高它。我回答了您上面的问题。谢谢你教我这些命令(顺便说一句;)我回答了你上面的问题。谢谢你教我这些命令(顺便说一句;)再加上一点,您总共有4GB的地址空间。在Linux下,通常的情况是为内核保留1GB的内存,剩下3GB。在这3GB中,您有您的程序代码、数据和堆栈、正在使用的任何共享库的代码和数据,以及一些其他内容(保护页、
mmap()
ed文件等)。因此,实际上,即使是一个最小的项目,超过2.5GB的拨款也会有问题,而且可能会比这小得多,由于其他各种东西通常是在哪里分配的。因此,如果我运行同一程序的多个实例,我将得到相同的错误,但值较小?再加上一点,您总共有4GB的地址空间。在Linux下,通常的情况是为内核保留1GB的内存,剩下3GB。在这3GB中,您有您的程序代码、数据和堆栈、正在使用的任何共享库的代码和数据,以及一些其他内容(保护页、mmap()
ed文件等)。实际上,即使是一个最小的程序,2.5GB以上的分配也会有问题,而且可能会比这个小得多,因为其他的东西通常都是分配的。所以,如果我运行同一个程序的多个实例,我会得到相同的错误和较小的值?所以你有512MB(虚拟)RAM,这意味着,如果4GB分配甚至可以成功(在32位平台上,由于各种原因,4GB分配无法成功),那么您还需要3.5GB的交换来覆盖剩余的分配。您的虚拟机配置了多少交换空间?因此您有512MB(虚拟)RAM,这意味着,如果4GB分配能够成功(在32位平台上由于各种原因无法成功),您还需要3.5GB的交换空间来完成剩余的分配。你的虚拟机配置了多少交换?谢谢你的回答。有没有办法知道我目前分配空间的限制?如果出于某种原因我需要更多,我如何获得更多?有几个限制:ulimit
,系统限制,如linux中的1/3 GiB分割,硬件大小。您可以查看/proc/meminfo
或命令free
,查看您的总内存。如果您需要更多,您可以修改
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