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