4

以下发生在 alinux 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) run 启动程序:/home/cpd20202/sorting/error

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

我真的没主意了。

4

5 回答 5

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;
}
于 2012-05-14T00:18:44.317 回答
5

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

于 2012-05-14T00:18:30.177 回答
3

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

您有两个基本选择:

  • 将您的数组分配为全局变量(通过将其声明移到外部main)。
  • 使用、或将数组分配到堆上mallocnewstd::vector
于 2012-05-14T00:18:47.390 回答
0

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

int v[size]; // stack
int v* = new int[size]; // heap
于 2012-05-14T00:19:25.487 回答
0

您为堆栈分配了太多空间来处理(1000 万个整数是非常大的数量)。

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

malloc(sizeof(int) * 10000000);

于 2012-05-14T02:44:14.467 回答