Linux下寫C++程序出現“段錯誤(核心已轉儲)”的問題:
段錯誤一般就是指訪問的內存超出了系統所給這個程序的內存空間,通常這個值是由gdtr來保存的,他是一個48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相應於gdt的下標,最后3位包括了程序是否在內存中以及程序的在cpu中的運行級別,指向的gdt是由以64位為一個單位的表,在這張表中就保存着程序運行的代碼段以及數據段的起始地址以及與此相應的段限和頁面交換還有程序運行級別還有內存粒度等等的信息。一旦一個程序發生了越界訪問,cpu就會產生相應的異常保護,於是segmentation fault就出現了。在編程中基本是是錯誤地使用指針引起的。
其中主要可能有以下幾個方面的原因:
1.內存訪問出錯
這類問題的典型代表就是數組越界,訪問到不屬於你的內存區域 。
2.非法內存訪問
出現這類問題主要是程序試圖訪問內核段內存而產生的錯誤。
3.棧溢出
Linux默認給一個進程分配的棧空間大小為8M。c++申請變量時,new操作申請的變量在堆中,其他變量一般在存儲在棧中。因此如果你數組開的過大變會出現這種問題。
之前遇到過的問題原因是:在新建指針的時候沒有初始化。如果要用指針,則在C中用 char *s=(char *)malloc(100*sizeof(char)) 為其分配內存空間,c++ 中用char *s=new char [100]。如果未分配內存空間,編譯時不會檢查出問題,但運行時可能會出現“段錯誤(核心已轉儲)” 錯誤。