Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

สาเหตุของโปรแกรม 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() แบบไม่สิ้นสุด คำสั่งส่งคืนไม่เหมาะสมในกรณีนี้

ตัวอย่าง

#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)

ข้อผิดพลาดในการแบ่งส่วน

ข้อผิดพลาดในการแบ่งส่วนหรือคอร์ดัมพ์เกิดขึ้นเมื่อโปรแกรมพยายามเข้าถึงตำแหน่งหน่วยความจำที่ไม่ได้เป็นของโปรแกรม ในโปรแกรมต่อไปนี้ pointer 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);
}