C++ 分段错误:堆栈溢出

C++ 分段错误:堆栈溢出,c++,segmentation-fault,stack-overflow,cout,C++,Segmentation Fault,Stack Overflow,Cout,以下内容出现在linux 2.6.32-220.7.1.el6.x86_64和g++4.4.6中 以下代码: #include <iostream> #include <cstdlib> int PROB_SIZE = 10000000; using namespace std; int main(int argc, char *argv[]) { unsigned int numbers[PROB_SIZE]; cout <<

以下内容出现在
linux 2.6.32-220.7.1.el6.x86_64
g++4.4.6

以下代码:

#include <iostream>
#include <cstdlib>

int PROB_SIZE   = 10000000;
using namespace std;

int main(int argc, char *argv[])    {

    unsigned int numbers[PROB_SIZE];
    cout << "Generating " << PROB_SIZE << " random numbers... " << flush;

    return 0;
}
#包括
#包括
int PROB_SIZE=10000000;
使用名称空间std;
int main(int argc,char*argv[]){
无符号整数[PROB_SIZE];

cout您的“数字”数组正在堆栈上分配,可能太大了。您需要动态分配该数组。

这是因为您的数组大于堆栈的大小。因此,当您的程序在函数调用期间尝试推送新内容时,程序会崩溃

您得到的错误在概念上与堆栈溢出相同,只是它是由局部变量非常大而不是嵌套太多函数调用引起的

堆栈是供内务管理和局部变量函数使用的一小块内存。它从来都不是很大的,最多只有几兆字节。这就是为什么您需要动态分配来解决问题。大多数动态分配将利用堆,而堆通常只受物理内存的限制

您需要在堆上分配数组。为此,您有几个选项,其中最简单的可能是使用
std::vector
。它们的行为与普通数组大致相同,并且它们的存储是自动管理的,因此这应该不是问题

#include <vector>
#include <iostream>

int PROB_SIZE   = 10000000;
using namespace std;

int main()
{
    vector<int> numbers(PROB_SIZE);
    cout << "Generating " << PROB_SIZE << " random numbers... " << flush;

    return 0;
}
#包括
#包括
int PROB_SIZE=10000000;
使用名称空间std;
int main()
{
向量数(概率大小);

cout您的进程没有足够的堆栈空间来分配1000万个整数。即40兆字节(如果您的
int
为64位,则为80兆字节),进程通常从大约1兆字节的堆栈开始

您有两个基本选择:

  • 将数组作为全局变量分配(将其声明移到
    main
    之外)
  • 使用
    malloc
    new
    std::vector
    在堆上分配数组

这是不可能的。您可以在堆栈上分配一个非常大的数组,
数字
,然后对堆栈进行压缩。堆栈通常是8MB左右,而阵列是40MB左右

int v[size]; // stack
int v* = new int[size]; // heap

您为堆栈分配的空间太多,无法处理(1000万整数是一个非常大的数量)

如果您确实需要这么多,我建议您使用堆空间,而不是使用:


马洛克(国际规模)*10000000

最简单,通常也是最有效的*。这台机器有48GB的内存…@RSFalcon7,这是堆的大小。堆栈要小得多。因此,您需要在堆上而不是堆栈上分配内存。@RSFalcon7系统中的内存量与堆栈的大小无关,通常是~1MB。@RSFalcon7,amo内存的unt与堆栈的大小无关。进程从(少量)固定内存开始,供函数和函数调用使用。如果需要更多内存,则需要点击“堆”,它具有您所有物理内存的潜力。@RSFalcon7,全局声明它意味着它不再在堆栈上分配。为了响应您之前的帖子,堆栈大小取决于计算机。如果您真的想增加它,您可以增加它。尽管这会解决眼前的问题,但我建议不要将变量移动到global作用域…或者通过将其定义为
static
(虽然
std::vector
可能是正确的选择)来保留本地作用域,同时为其提供静态存储持续时间。@chris
ulimit-s
在我的香草ubuntu(amd64)上机器返回8192。从我从大多数人身上看到的情况来看,除非他们改变它,否则它是1MB。人与人之间肯定会有所不同,但我很确定1MB是最常见的。@chris-hmm,我刚刚测试了五台Linux机器(都是x64)最低的是8MB,可能是32/64位的东西。我在我的x64 Windows上测试了这个,它似乎刚刚超过2MB。我知道两者之间的区别;)我不知道的是我的堆栈只有1MB:$ulimit-s 10240
int v[size]; // stack
int v* = new int[size]; // heap