Menu
CoddyTech

Rò rỉ bộ nhớ

Bài học 12 trên 14 trong khóa học Con trỏ trong C++ của Coddy.

Ở bài học trước, chúng ta đã dùng từ khóa delete vì việc giải phóng vùng nhớ bạn đã cấp phát rất quan trọng. Bây giờ, chúng ta sẽ tìm hiểu kỹ hơn về vấn đề này.

Rò rỉ bộ nhớ xảy ra khi chương trình cấp phát bộ nhớ từ heap nhưng không giải phóng bộ nhớ đó sau khi không còn cần dùng nữa.

Về cơ bản, khi chạy chương trình, chúng ta cấp phát vùng nhớ cần thiết, rồi sau đó quên mất vùng nhớ đó và nó không bao giờ được giải phóng hoặc xóa. Hãy xem ví dụ bên dưới:

int *p, *q; // Khai báo
p = new int; // Cấp phát bộ nhớ
q = new int; // Cấp phát bộ nhớ

*p = 10; // Gán giá trị
*q = 20; // Gán giá trị

cout << *p << " " << *q << endl;
q = p; // q và p trỏ đến cùng một vị trí
// Vị trí ban đầu của q đã bị MẤT
cout << *p << " " << *q << endl;

delete p;
delete q;
Output:
10 20
10 10

Đầu tiên, chúng ta khai báo các con trỏ, cấp phát bộ nhớ cho mỗi số nguyên, rồi đặt các giá trị tại những địa chỉ đó. Như bạn thấy, chúng ta có thể in chúng ra bằng cout đầu tiên. 


Điều thú vị nằm ở dòng <i>q = p</i>. Ở đây, chúng ta đặt con trỏ <i>q</i> trỏ đến cùng vị trí với con trỏ <i>p</i>. Vì vậy, vị trí ban đầu được cấp phát để <i>q</i> trỏ đến sẽ bị mất vĩnh viễn, không thể truy cập hay xóa được nữa.


Như bạn thấy ở dòng tiếp theo, chúng ta in lại các con trỏ đã giải tham chiếu và nhận được các giá trị bằng nhau vì chúng trỏ đến cùng một vị trí.

Đó là lý do việc chú ý đến rò rỉ bộ nhớ và quản lý dữ liệu được cấp phát động rất quan trọng.

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

challenge icon

Thử thách

Dễ

Viết lại chương trình giống như ở bài học trước, nhưng lần này giải phóng toàn bộ bộ nhớ đã cấp phát bằng từ khóa delete. Cấp phát động bộ nhớ cho ba số nguyên bằng các con trỏ ptrA, ptrB và ptrC. Dùng ba số nguyên được truyền vào làm đối số của hàm và đặt giá trị tại địa chỉ con trỏ lần lượt bằng các số nguyên đó. Số nguyên thứ nhất cho ptrA, số nguyên thứ hai cho ptrB, số nguyên cuối cùng cho ptrC, rồi in ra tất cả các con trỏ sau khi giải tham chiếu, ngăn cách nhau bằng khoảng trắng.

KHÔNG viết hàm <i>main()</i>

Tự làm thử

#include <iostream>

using namespace std;

void dynamicMemory(int a, int b, int c) {
    // Viết code của bạn vào đây
    
    // Giải phóng bộ nhớ
}

// KHÔNG viết hàm main()

Tất cả bài học trong Con trỏ trong C++

Tự luyện tập: Trình biên dịch C++ online