2011-12-29 47 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」之前發生堆棧溢出的原因。