Trang tài liệu
Khóa học C++ nền tảng
Chương 6. Con trỏ và tham chiếu
Rò rỉ bộ nhớ

Rò rỉ bộ nhớ

Rò rỉ bộ nhớ xảy ra khi một chương trình phân bổ bộ nhớ trong heap nhưng không giải phóng bộ nhớ trở lại hệ điều hành khi không còn cần thiết. Theo thời gian, điều này dẫn đến cạn kiệt bộ nhớ khả dụng, dẫn đến hiệu suất hệ thống thấp hoặc treo máy.

Trong C++, khi bạn sử dụng con trỏ raw, bạn cần quản lý phân bổ và giải phóng bộ nhớ theo cách thủ công. Trong nhiều trường hợp, bạn sẽ sử dụng từ khóa new để phân bổ bộ nhớ cho một đối tượng trong heap và sử dụng từ khóa delete để giải phóng bộ nhớ đó khi không còn cần thiết. Quên làm điều này có thể gây rò rỉ bộ nhớ.

Đây là một ví dụ:

void create_memory_leak() {
    int* ptr = new int[100]; // phân bổ bộ nhớ trong heap cho một mảng số nguyên
    // một số mã code...
    // Mã code giải phóng bộ nhớ bị thiếu: delete[] ptr;
} // ptr vượt quá phạm vi, khối bộ nhớ được phân bổ không được giải phóng, gây rò rỉ bộ nhớ.

Để tránh rò rỉ bộ nhớ, bạn phải luôn đảm bảo rằng bộ nhớ được giải phóng trước khi một con trỏ vượt ra ngoài phạm vi hoặc được gán lại. Một số cách để đạt được điều này bao gồm sử dụng con trỏ thông minh C++ (std::unique_ptr, std::shared_ptr), kỹ thuật RAII (Khởi tạo thu nhận tài nguyên) và bộ chứa từ thư viện chuẩn C++ quản lý phân bổ bộ nhớ bên trong (ví dụ: std::vector, std::string).

Ví dụ: mã code này sẽ không bị rò rỉ bộ nhớ:

#include <memory>
void no_memory_leak() {
    std::shared_ptr<int> ptr = std::make_shared<int[]>(100); // phân bổ bộ nhớ trong heap cho một mảng số nguyên bằng shared_ptr
    // mốt số mã code...
} // shared_ptr vượt quá phạm vi và nó sẽ tự động giải phóng khối bộ nhớ được gán cho nó.