Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++/Linux:动态分配产生两条不同的错误消息 这里是一个简单的C++程序,它采用大小参数并分配一个整数数组。该程序是在32位体系结构的虚拟机上运行的Linux下使用g++编译的。 当应用程序在参数(数组大小)高于1073741823*的情况下调用时,我得到_C++_Linux_Segmentation Fault - Fatal编程技术网

C++/Linux:动态分配产生两条不同的错误消息 这里是一个简单的C++程序,它采用大小参数并分配一个整数数组。该程序是在32位体系结构的虚拟机上运行的Linux下使用g++编译的。 当应用程序在参数(数组大小)高于1073741823*的情况下调用时,我得到

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> /

分段故障(堆芯转储)

错误,其值略小于我得到的值

在抛出“std::bad_alloc”的实例后终止调用
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