linux下編程,定義數組一多就會崩潰,如何解決?

struct pts{

float x,y,z;

}

class CloudXYZ{

public:

pts points[50000];

int size;

}

如上,定義4個CloudXYZ就會崩潰,當我把points改成10w時定義兩個就崩,3w時7個。

懷疑是程序限制了內存,求解決方案~

另問一句,顯示Segmentation fault和Segmentation fault(core dumped)有什麼區別?

跪謝!


應該是棧溢出

void foo()
{
CloudXYZ *c = new CloudXYZ(); //堆
CloudXYZ c; //棧
}

程序在運行時需要用到的內存空間分為堆空間和棧空間,如果你用的是C++,可以簡單的理解為在函數內部類似上面第一行new出來的c佔用的內存在堆上,第二行得到的c佔用內存在棧上。

程序運行時堆的空間可以簡單理解為非常大,而棧的空間是有限制的,在Linux上可以使用ulimit -s指令查看所用系統的默認棧大小,單位是kb。

一般情況下棧空間也就幾Mb大小,你這樣動不動就幾十萬個float的數組,把它撐爆是很常見的事情。

解決方法:

擴大棧空間;或者讓你的變數使用堆空間;或者使用STL容器而不是數組來存放points,當然本質上也是在使用堆空間。

除此之外你也可以把變數放在全局域讓它成為全局變數,或者加上static讓它成為靜態變數,這樣變數會放在全局存儲區不使用堆或棧空間,不過這都是不推薦的做法。

Segmentation fault和Segmentation fault(core dumped)的區別在於 後面一句提示你生成了崩潰的core dump文件。一般情況下是在程序同目錄下一個類似xxxx.core的文件,這是程序發生崩潰時,Linux系統將當時進程空間的內存全部保存下來,你可以使用工具分析這些內存信息定位崩潰原因。


#pragma comment(linker, "/STACK:1024000000,1024000000")

手動擴棧。在預處理處加上。


core dumped讓我想到了ctrl+的SIGQUIT信號,

有沒有這個,可能是數據段錯誤時系統做出了不同的處理,反正是把程序幹掉了,要麼SIGINT要麼SIGQUIT,

至於數據段錯誤,一般都是溢出,數組越界之類導致的,

怎麼解決就不懂了……


單個線程內默認棧是8M 你搞一下子申請那麼大內存在棧上 高毛線


可以通過limits命令改變棧大小.大內存還是使用vector吧


最近都有強迫症了……內核只有8k的棧


推薦閱讀:

(截止2014.8.21)windows平台上完成一個編譯器(詞法、語法分析),想使用C++11開發,有啥好的技術推薦嗎?
這是OS X下g++的bug嗎?
遞歸下降的語法分析程序如何進行錯誤恢復?
模板編程如何引入類型是否存在條件???
能否通過對編譯器或者編譯環境的限制來應對木馬或者病毒呢?

TAG:編程 | Linux | C | 編譯器 | Linux開發 |