在一些内存测试中,我做了以下程序的段错误:
#include <string>
#include <iostream>
using namespace std;
int main()
{
cout << "Beginning Test" << endl;
const int N = 2000000;
string sArray[N];
return 0;
}
由于我在打印“Beginning Test”之前得到了段错误,我在GDB中运行它并检查了回溯,我得到的唯一的东西是:
编程接收信号SIGSEGV,分段故障 main.cxx中main()中的0x00000000004008c5:11 11弦sArray [N];
中main()中的#0 0x00000000004008c5
(gdb)bt
Main.cxx:11
对我来说最奇怪的是,如果我将N设置为1000000(1M)而不是2000000(2M),我就不会得到段错误。
可能出现问题的任何线索?
我正在使用Linux Red-Hat 2.6.18和g ++(GCC)4.1.2。
谢谢!
答案 0 :(得分:15)
堆栈溢出......
你故意它,不是吗?
答案 1 :(得分:6)
您正在溢出堆栈,由于某种原因,输出不会被刷新。 2M string
s是相当多的记忆。尝试使用heap
代替stack
。
最重要的是,使用vector
代替数组并停止担心手动分配。
答案 2 :(得分:1)
string sArray[N];
可能耗尽所有堆栈内存导致它发生段错误。
答案 3 :(得分:1)
sArray是主方法的本地方法,因此它将在堆栈上分配。但堆栈不足以容纳2000000个元素,因此它会爆炸。
现在,编译器尝试在函数的最开始分配sArray(概念上,在'{',),这就是为什么在输出“Beginning Test”之前发生堆栈溢出的原因。
答案 4 :(得分:0)
你刚刚堆栈溢出。 如果要在堆栈上分配大型数组,则需要更改堆栈大小。 在这里寻找指令Increase stack size in Linux with setrlimit