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);
}

更新於: 2020年8月13日

948 次檢視

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告