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

Các nguyên nhân gây crash chương trình C++


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: Segmentation fault, Aborted, Floating point exception... Dưới đây là các nguyên nhân chính và ví dụ minh họa.

1. Ngoại lệ (Exceptions) không xử lý

Chương trình crash khi gặp exception không được bắt bởi try-catch. Ví dụ điển hình: chia cho 0.

#include <iostream>
int main() {
    int num1 = 10, num2 = 0;
    int quotient = num1 / num2; // Floating point exception (SIGFPE)
    cout << quotient;
    return 0;
}

Output: Floating point exception (core dumped)

Khắc phục: Kiểm tra mẫu số != 0 trước khi chia, hoặc dùng try-catch (cho floating point, integer division không ném exception C++ chuẩn).

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

Ghi dữ liệu vượt quá kích thước buffer, ghi đè bộ nhớ liền kề.

#include <iostream>
#include <cstring>
int main() {
    int num = 100;
    char c[2];
    strcpy(c, "abcdefghijklmnopqrstuvwxyz"); // Ghi 26 bytes vào buffer 2 bytes
    cout << c;
    return 0;
}

Output: Segmentation fault (core dumped)

Khắc phục: Dùng strncpy, std::string, std::vector, hoặc kiểm tra kích thước trước khi copy.

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

Gây ra bởi đệ quy vô hạn hoặc biến cục bộ quá lớn. Stack có kích thước giới hạn (thường 1-8MB).

#include <iostream>
int factorial(int n) {
    if (n == 0) return 1;
    return factorial(n); // Lỗi: thiếu n-1, đệ quy vô hạn
}
int main() {
    cout << factorial(10);
}

Output: Segmentation fault (core dumped)

Khắc phục: Kiểm tra điều kiện dừng đệ quy, dùng vòng lặp thay đệ quy sâu, tăng stack size nếu cần.

4. Lỗi phân đoạn bộ nhớ (Segmentation Fault)

Truy cập địa chỉ bộ nhớ không hợp lệ: con trỏ null, con trỏ wild, truy cập mảng vượt chỉ số, dùng sau free/delete.

#include <iostream>
int main() {
    char *str;
    char name[] = "iostream";
    str = name;
    while (1) (*str++) = 'a'; // Vượt khỏi mảng name, ghi vào vùng nhớ không hợp lệ
}

Output: Segmentation fault (core dumped)

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

Cấp phát động (new/malloc) nhưng không giải phóng (delete/free). Chạy lâu dần hết RAM.

#include <iostream>
#include <cstdlib>
int main() {
    while (true) {
        int *node = (int*) malloc(9999999); // Cấp phát ~40MB mỗi lần
        // free(node); // Quên giải phóng
    }
}

Khắc phục: Luôn delete/free sau khi dùng xong. Dùng smart pointer (unique_ptr, shared_ptr), RAII containers (vector, string).

Tóm tắt các lỗi thường gặp

LỗiNguyên nhânDấu hiệu
SIGFPEChia 0, floating point errorFloating point exception
SIGSEGVTruy cập nhớ saiSegmentation fault
Stack OverflowĐệ quy sâu, biến lớn trên stackSegmentation fault
Buffer OverflowGhi vượt mảngSegfault, data corruption
Memory LeakQuên free/deleteRAM tăng dần, crash sau lâu

Công cụ debug: gdb, valgrind, AddressSanitizer (-fsanitize=address), static analysis (cppcheck, clang-tidy).