在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;
}生成以下SIGSEGV:(gdb)运行启动程序: /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我真的没主意了。
发布于 2012-05-14 08:18:30
您的"numbers“数组正在堆栈上分配,可能太大了。您将需要动态分配数组。
发布于 2012-05-14 08:18:44
这是因为您的数组大于堆栈的大小。因此,当您的程序试图在函数调用期间推送一些新的东西时,它会崩溃。
你得到的错误在概念上与堆栈溢出是一样的,只是它是由一个非常大的局部变量引起的,而不是嵌套了太多的函数调用。
堆栈是一小块内存区域,供用于内务和局部变量的函数使用。它从来不是很大,最多只有几兆字节。这就是为什么你需要一个动态分配来解决你的问题。大多数动态分配将在堆上进行,堆通常只受物理内存的限制。
您将需要在堆上分配数组。为此,您有几种选择,其中最简单的可能是使用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-14 08:18:47
您的进程没有足够的堆栈空间来分配一千万个整数。这是40兆字节(或者如果你的int是64位的话是80兆字节),进程通常从大约1兆字节的堆栈开始。
您有两个基本选择:
将数组作为全局变量分配(通过使用std::vector.、或
malloc之外),将数组作为全局变量进行分配https://stackoverflow.com/questions/10576257
复制相似问题