2011-12-29 64 views
2

在一些内存测试中,我做了我从下面的程序分段错误之前:非常奇怪的分段错误主要

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

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

因为我得到了赛格故障“开始测试”付印前,我在GDB中运行并检查了堆栈回溯,唯一得到的结果是:

程序接收到的信号SIGSEGV,分段错误。
Main.cxx中main()中的0x00000000004008c5:11
11 string sArray [N];
(GDB)BT
#0 0x00000000004008c5在main()在Main.cxx:11

对我来说,最奇怪的是,如果设置了N到1000000(1M)代替2000000(2M)我没有收到seg-fault
任何线索可能是什么问题?

我使用Linux Red-Hat 2.6.18和g ++(GCC)4.1.2。
Tnx。

+1

等待,您试图在_stack _上分配2 MB * sizeof(字符串) – fge 2011-12-29 11:21:24

回答

15

堆栈溢出...

是故意的,不是吗?

+0

哈哈,但为什么这么小呢? sizeof(string)= 8,所以2,000,000 * 8 = 16MB。这意味着堆栈大小大于8MB,小于16MB,但对我来说似乎非常小(本机上有32GB RAM) – JohnnyW 2011-12-29 13:04:04

+0

@JohnnyW堆栈很小,但程序(数据和堆)可用的内存为相当大。 – cnicutar 2011-12-29 13:07:29

+0

是的,我意识到这一点,但为什么堆栈大小如此有限? – JohnnyW 2011-12-29 13:19:48

6

您正在溢出堆栈,并且出于某种原因输出不会被刷新。 2M string s是相当多的内存。尝试使用heap而不是stack

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

1
string sArray[N]; 

可能是用尽所有堆栈内存导致它发生段错误。

1

会发生什么是sArray是您的主要方法的本地,所以它将被分配在堆栈上。但是这个堆栈还不足以容纳200万个元素,所以它爆炸了。

现在,编译器试图在函数的最开始分配sArray(概念上,在'{',),这就是为什么在输出“Beginning Test”之前发生堆栈溢出的原因。