在main之前的C++程序中出现奇怪的分段错误

inf*_*ler 2 c++ linux segmentation-fault

在一些内存测试中,我做了以下程序的段错误:

#include <string>
#include <iostream>
using namespace std;

int main()
{
    cout << "Beginning Test" << endl;
    const int N = 2000000;  
    string sArray[N];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于我在打印"Beginning Test"之前得到了段错误,我在GDB中运行它并检查了回溯,我得到的唯一的东西是:

程序接收信号SIGSEGV,分段故障.
Main.cxx中main()中的0x00000000004008c5:11
11字符串sArray [N];
(gdb)bt
#0 0x00000000004008c5在Main.cxx:11的main()中

对我来说最奇怪的是,如果我将N设置为1000000(1M)而不是2000000(2M),我就不会得到段错误.

可能是什么问题的任何线索?

我正在使用Linux Red-Hat 2.6.18和g ++(GCC)4.1.2.

谢谢!

fge*_*fge 15

堆栈溢出...

确实是故意的,不是吗?

  • 因为我们通常不需要很多堆栈,所以最好不要在不需要时浪费部分堆栈空间的地址范围.不要忘记每个线程都需要自己的堆栈,所以在任何给定的时刻你的机器上都有很多堆栈.我们不需要大量的堆栈,因为我们从不在其中分配大型对象.如果我们这样做了,那么我们就不会发现任何数量的堆栈.我们只是将堆用于大对象,我们必须使用它,因为有些东西无法通过堆栈完成. (2认同)

cni*_*tar 6

您正在溢出堆栈,由于某种原因,输出不会被刷新.2M strings是相当多的记忆.尝试使用heap而不是stack.

最重要的是,使用vector而不是阵列,并不再担心手动分配.