Bỏ qua để đến nội dung

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

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).

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.

#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ự động

Rò rỉ bộ nhớ: cấp phát bằng new mà quên delete, 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 (return sớ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ó