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

การนับคอลัมน์ที่ต้องลบเพื่อให้แถวแต่ละแถวเรียงลำดับใน C++

พฤติกรรมที่ผิดปกติของโปรแกรม C++ มักนำไปสู่การล้มเหลวของโปรแกรม (program crash) คุณอาจเคยเจอปัญหาเช่น Segmentation fault, Aborted, Floating point exception เป็นต้น ตัวอย่างโปรแกรมต่อไปนี้อาจช่วยให้คุณเข้าใจสาเหตุของการล้มเหลวของโปรแกรม C++

ข้อยกเว้น (Exceptions)

ข้อยกเว้นใน 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)

Buffer Overflow

Buffer เป็นพื้นที่จัดเก็บชั่วคราว เมื่อโปรแกรมเขียนข้อมูลลง buffer เกินขนาดที่ buffer รองรับได้ ข้อมูลส่วนเกินจะล้นออกนอกขอบเขตของ buffer ข้อมูลจะเขียนทับตำแหน่งหน่วยความจำที่อยู่ติดกัน โปรแกรมต่อไปนี้เปลี่ยนพฤติกรรมเมื่ออินพุตเกินขนาดที่ตัวแปร num จะเก็บได้

ตัวอย่าง

#include <iostream>
#include <string.h>
int main() {
    int num = 100;
    cout << "\nValue for num:" << num;
    char c[2];
    strcpy(c, "abcdefghijklmnopqrstuvwxyz");
    cout << "\nValue for c:" << c;
    return 0;
}

ผลลัพธ์

Value for num:100 Segmentation fault (core dumped)

Stack Overflow

ปัญหา Stack Overflow เกิดขึ้นเมื่อ pointer ของ call stack เกินขอบเขตของ stack Stack ประกอบด้วยพื้นที่จำกัด เมื่อโปรแกรมใช้พื้นที่มากกว่าที่มีใน stack แล้ว stack จะล้นและทำให้โปรแกรมล้มเหลว สาเหตุทั่วไปที่สุดคือ infinite recursion (การเรียกซ้ำไม่มีที่สิ้นสุด)

โปรแกรมต่อไปนี้มีการเรียกฟังก์ชัน 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);
    cout << fact;
}

ผลลัพธ์

Segmentation fault (core dumped)

Segmentation Fault

Segmentation fault หรือ core dump เกิดขึ้นเมื่อโปรแกรมพยายามเข้าถึงตำแหน่งหน่วยความจำที่ไม่ได้เป็นของมัน ในโปรแกรมต่อไปนี้ pointer str กำลังเพิ่มขึ้นและผนวกหน่วยความจำอย่างไม่มีที่สิ้นสุด

ตัวอย่าง

#include <iostream>
int main() {
    char *str;
    char name[] = "iostream";
    str = name;
    while (1)
        (*str++) = 'a';
}

ผลลัพธ์

Segmentation fault (core dumped)

Memory Leaks

Memory leaks (รั่วไหลของหน่วยความจำ) เกิดขึ้นเมื่อหน่วยความจำที่จัดสรรแบบไดนามิกไม่เคยถูกปล่อยคืน หน่วยความจำต้องถูกปล่อยคืนเมื่อไม่ได้ใช้งานอีกต่อไป หากเราจัดสรรหน่วยความจำซ้ำๆ ตลอดเวลา memory leaks เหล่านี้จะสะสมและในที่สุดจะทำให้โปรแกรมล้มเหลว การทำซ้ำโค้ดที่ไม่ดีอย่างด้านล่างทำให้เกิด memory leaks

ตัวอย่าง

#include <iostream>
int main() {
    int *node;
    node = (int *) malloc(9999999);
    // free(node);
}