分段错误:堆栈溢出

时间:2012-05-14 00:16:51

标签: c++ segmentation-fault stack-overflow cout

以下内容出现在linux 2.6.32-220.7.1.el6.x86_64g++ 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;
}

生成以下SIGSEGV:     (gdb)运行     启动程序:/ home / cpd20202 /排序/错误

Program received signal SIGSEGV, Segmentation fault.
0x000000000040093b in main (argc=1, argv=0x7fffffffe4f8) at error.cpp:13
13      cout << "Generating " << PROB_SIZE << " random numbers... " << flush;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.47.el6_2.5.x86_64 libgcc-4.4.6-3.el6.x86_64 libstdc++-4.4.6-3.el6.x86_64
(gdb) where
#0  0x000000000040093b in main (argc=1, argv=0x7fffffffe4f8) at error.cpp:13

我真的没有想法。

5 个答案:

答案 0 :(得分:8)

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

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

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

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

#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;
}

答案 1 :(得分:5)

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

答案 2 :(得分:3)

您的进程没有足够的堆栈空间来分配一千万个整数。这是40兆字节(如果int是64位,则为80),并且进程通常以大约 1 兆字节的堆栈开始。

您有两个基本选择:

  • 将您的数组分配为全局变量(通过将其声明移到main之外)。
  • 使用mallocnewstd::vector上分配您的数组。

答案 3 :(得分:0)

这不是cout。您在堆栈上分配一个非常大的数组numbers并炸掉堆栈。堆栈通常为8 mb左右,而阵列大约为40 MB左右。

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

答案 4 :(得分:0)

你正在为堆栈分配太多空间来处理(1000万英寸是一个非常大的数量)。

如果你真的需要这么多,我建议你使用堆空间代替:

malloc(sizeof(int)* 10000000);