Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Các nguyên nhân phổ biến khiến chương trình C++ bị crash

Hành vi bất thường của chương trình C++ thường dẫn đến crash. Bạn có thể gặp lỗi như Segmentation fault, Aborted, Floating point exception. Dưới đây là các chương trình mẫu giúp hiểu nguyên nhân crash.

Ngoại lệ (Exceptions)

Ngoại lệ trong C++ là phản ứng khi chương trình gặp điều kiện bất thường. Chương trình crash nếu không xử lý đúng bằng try-catch. Chương trình sau crash do chia cho 0:

Ví dụ

#include <iostream>
int main() {
    int num1 = 10;
    int num2 = 0;
    int quotient = num1 / num2;
    printf("\n Quotient is: %d", quotient);
    return 0;
}

Đầu ra

Floating point exception (core dumped)

Tràn bộ đệm (Buffer Overflow)

Bộ đệm là khu vực lưu trữ tạm. Khi ghi dữ liệu vượt quá kích thước bộ đệm, dữ liệu thừa ghi đè vào vùng nhớ liền kề. Chương trình sau thay đổi hành vi khi nhập vượt quá kích thước biến num.

Ví dụ

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

Đầu ra

Value for num:100
Segmentation fault (core dumped)

Tràn ngăn xếp (Stack Overflow)

Stack Overflow xảy ra khi con trỏ call stack vượt quá giới hạn ngăn xếp. Ngăn xếp có không gian hạn chế. Khi chương trình dùng nhiều không gian hơn có sẵn, ngăn xếp tràn và crash. Nguyên nhân phổ biến là đệ quy vô hạn.

Chương trình sau có gọi vô hạn hàm factorial(). Câu lệnh return không đúng.

Ví dụ

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

Đầu ra

Segmentation fault (core dumped)

Lỗi phân đoạn (Segmentation Fault)

Segmentation fault hoặc core dump xảy ra khi chương trình truy cập vị trí nhớ không thuộc về nó. Chương trình sau, con trỏ str tăng và ghi vô hạn.

Ví dụ

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

Đầu ra

Segmentation fault (core dumped)

Rò rỉ bộ nhớ (Memory Leaks)

Rò rỉ bộ nhớ xảy ra khi bộ nhớ cấp phát động không được giải phóng. Bộ nhớ phải được giải phóng khi không dùng nữa. Nếu liên tục cấp phát lại, rò rỉ sẽ tích lũy và cuối cùng crash. Lặp lại code kém như dưới gây rò rỉ:

Ví dụ

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