Rò rỉ bộ nhớ (Memory Leak)
Vấn đề
Phần tiêu đề “Vấn đề”Rò rỉ bộ nhớ xảy ra khi chương trình cấp phát bộ nhớ động (new) nhưng không bao giờ giải phóng nó (delete) - vùng nhớ đó bị “mất dấu” và chiếm dụng RAM cho đến khi chương trình kết thúc.
void process() { int* data = new int[1000]; // ... xử lý data ... // Quên delete[] data! -> Rò rỉ 1000 số nguyên mỗi lần gọi hàm này}
int main() { for (int i = 0; i < 1000000; i++) { process(); // Gọi 1 triệu lần -> rò rỉ ngày càng lớn } return 0;}Rò rỉ ẩn khi có return sớm hoặc exception
Phần tiêu đề “Rò rỉ ẩn khi có return sớm hoặc exception”void risky(bool condition) { int* data = new int[100];
if (condition) { return; // Thoát sớm - QUÊN giải phóng data trước khi return! }
delete[] data;}Đây là lý do vì sao logic giải phóng thủ công rất dễ bị bỏ sót khi code có nhiều đường thoát (nhiều return, throw).
Cách phát hiện rò rỉ bộ nhớ
Phần tiêu đề “Cách phát hiện rò rỉ bộ nhớ”Rò rỉ bộ nhớ thường biểu hiện qua việc chương trình sử dụng RAM tăng dần theo thời gian mà không giảm xuống. Các công cụ như Valgrind (Linux/macOS) hoặc Address Sanitizer (-fsanitize=address khi biên dịch) giúp phát hiện rò rỉ một cách chính xác.
Giải pháp
Phần tiêu đề “Giải pháp”#include <memory>#include <vector>
void safe_process() { auto data = std::make_unique<int[]>(1000); // Tự động giải phóng, dù có return sớm hay exception // ... xử lý data ...} // Không cần delete[] - luôn được gọi tự độngTóm tắt
Phần tiêu đề “Tóm tắt”Rò rỉ bộ nhớ: cấp phát bằng
newmà quêndelete, khiến bộ nhớ bị chiếm dụng vĩnh viễn.
- Đặc biệt dễ xảy ra khi có nhiều đường thoát khỏi hàm (
returnsớm, exception)- Dùng smart pointer (
unique_ptr,shared_ptr) hoặc container chuẩn (vector) để tránh gần như hoàn toàn loại lỗi này- Dùng công cụ như Valgrind/Address Sanitizer để phát hiện rò rỉ trong code hiện có