Linux 下執行 C++ 程式出現 “段錯誤(核心已轉儲)”
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]。如果未分配記憶體空間,編譯時不會檢查出問題,但執行時可能會出現“段錯誤(核心已轉儲)” 錯誤。
Linux公社的RSS地址 :https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址:https://www.linuxidc.com/Linux/2019-04/158367.htm