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ỗi | Nguyên nhân | Dấu hiệu |
|---|---|---|
| SIGFPE | Chia 0, floating point error | Floating point exception |
| SIGSEGV | Truy cập nhớ sai | Segmentation fault |
| Stack Overflow | Đệ quy sâu, biến lớn trên stack | Segmentation fault |
| Buffer Overflow | Ghi vượt mảng | Segfault, data corruption |
| Memory Leak | Quên free/delete | RAM tăng dần, crash sau lâu |
Công cụ debug: gdb, valgrind, AddressSanitizer (-fsanitize=address), static analysis (cppcheck, clang-tidy).