พฤติกรรมที่ผิดปกติของโปรแกรม 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);
}