以下内容出现在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 /排序/错误
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
我真的没有想法。
答案 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
之外)。malloc
,new
或std::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);