C++程式崩潰的原因
C++程式的異常行為通常會導致程式崩潰。您可能遇到過段錯誤、終止、浮點數異常等問題。以下是一些示例程式,可以幫助您瞭解C++程式崩潰的原因。
異常
C++中的異常是程式在遇到異常情況時做出的響應。如果這些異常沒有使用try-catch塊正確處理,程式就會因為這些異常而崩潰。以下程式由於除以零異常而崩潰:
示例
#include <iostream> int main(){ int num1=10; int num2=0; int quotient=num1/num2; printf("\n Quotient is: %d",quotient); return 0; }
輸出
如果我們執行上面的程式碼,它將生成以下輸出:
Floating point exception (core dumped)
緩衝區溢位
緩衝區是一個臨時的儲存區域。當程式向緩衝區寫入資料時,如果超出緩衝區可以容納的大小,則額外的資料會超出緩衝區的邊界。資料會覆蓋到相鄰的記憶體位置。以下程式在輸入超過變數num可以容納的大小後,其行為就會發生改變。
示例
#include <iostream> #include <string.h> int main(){ int num=100; std::cout<<"\nValue for num:"<<num; char c[2]; strcpy(c,"abcdefghijklmnopqrstuvwxyz"); std::cout<<"\nValue for c:"<<c; return 0; }
輸出
如果我們執行上面的程式碼,它將生成以下輸出:
Value for num:100 Segmentation fault (core dumped)
棧溢位
棧溢位問題發生在呼叫棧指標超過棧邊界時。棧包含有限量的空間。當程式使用的空間超過棧上可用的空間時,就會發生棧溢位,導致程式崩潰。最常見的原因是無限遞迴。
以下程式包含對factorial()函式的無限次呼叫。在這種情況下,return語句不正確。
示例
#include <iostream> #include <string.h> int factorial(int num){ if(num==0) return 1; else return(factorial(num)); } int main(){ int n=10; int fact=factorial(n); std::cout<<fact; }
輸出
如果我們執行上面的程式碼,它將生成以下輸出:
Segmentation fault (core dumped)
段錯誤
段錯誤或核心轉儲發生在程式嘗試訪問不屬於它的記憶體位置時。在下面的程式中,指標str無限地遞增並追加記憶體。
示例
#include <iostream> int main(){ char *str; char name[]="iostream"; str=name; while(1) (*str++)='a'; }
輸出
如果我們執行上面的程式碼,它將生成以下輸出:
Segmentation fault (core dumped)
記憶體洩漏
當動態分配的記憶體從未被釋放時,就會發生記憶體洩漏。當記憶體不再使用時,必須釋放它。如果我們不斷地分配記憶體,那麼隨著時間的推移,這些記憶體洩漏會增加,最終會導致程式崩潰。像下面這樣的劣質程式碼的重複會導致記憶體洩漏:
示例
#include <iostream> int main(){ int *node; node = (int *) malloc(9999999); // free(node); }
廣告