Delete bộ nhớ cho single link list, queue và một số cấu trúc dữ liệu khác

em đang học về single link list và một số cấu trúc dữ liệu khác thì thầy dạy em là phải xoá bộ trong heap khi mình allocate nó nếu không sẽ có vấn đề cho máy tính chạy code đó ví dụ như

void deleteAll(Node* &p) {
	Node* tmp = p;
	while (tmp != nullptr) {
		p = p->pNext;
		delete tmp;
		tmp = p;
	}
}

nhưng khi em xem code của một số trang hướng dẫn như Greeks for Greeks thì họ hầu hết là không xoá bộ nhớ như vậy chỉ tạo ra chạy và kết thúc chương trình thôi. Cho em xin hỏi về vấn đề này bên nào đúng ạ!

Lúc mới học mình cũng có thắc mắc như bạn và mình tin nhiều người khác cũng vậy nên mình xin phép được giải thích chi tiết một chút.

Mỗi khi ta chạy một chương trình thì chương trình ấy luôn được Hệ Điều Hành cấp cho một vùng nhớ nhất định để làm việc. Vùng nhớ đó có 2 loại: StackHeap.

Memory Leaks: Là hiện tượng chúng ta yêu cầu cấp phát bộ nhớ trong Heap nhưng quên giải phóng. Điều này khiến cho chương trình của ta không thể tái sử dụng lại bộ nhớ đã được cấp phát trong Heap mặc dù chúng ta không còn cần đến nó nữa. Nếu hiện tượng này xảy ra liên tục thì về lâu về dài chương trình của bạn sẽ không thể yêu cầu Heap cấp phát nữa. Rõ ràng là chúng ta không muốn chương trình của mình dừng lại giữa chừng chỉ vì hết bộ nhớ.

Vậy nên, thầy của bạn đã đúng trong việc phải giải phóng bộ nhớ Heap sau khi đã hoàn tất công việc với các biến được khai báo trên Heap.

Tại sao Greeks for Greeks lại không làm như vậy?
Vì các chương trình họ đưa ra chỉ là những chương trình nhỏ có thời gian chạy ngắn nhằm demo lý thuyết trong bài. Chính vì thời gian chạy ngắn này nên họ biết rằng một khi chương trình của họ kết thúc, vùng nhớ (Stack và Heap) của chương trình sẽ bị lấy lại và giải phóng bởi Hệ Điều Hành. => Không cần phải tự giải phóng làm gì cho mất công.

Tuy nhiên, mình cho đây là thói quen xấu và bạn không nên làm theo. Trong một chương trình lớn, chương trình của bạn có thể yêu cầu cấp phát trên Heap rất nhiều và ở những thời điểm bạn không biết trước được nên sau khi làm xong chúng ta cứ “dọn dẹp” luôn cho nó lành.

P/s: Không liên quan tới topic nhưng hồi xưa đọc khóa C++ của anh Đạt xong cứ tưởng không giải phóng là sẽ mất luôn vĩnh viễn nên mỗi khi gõ C++ là run hết chân tay và cuối cùng chuồn qua Java :sweat:

4 Likes

bạn giải thích rất chi tiết , mình hiểu rồi. cám ơn bạn!

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?