Câu hỏi này thú vị phết mà giờ mới biết. Nhưng theo những gì mà tôi đã biết qua thì các biến được giải phóng khỏi bộ nhớ
hoàn toàn không giống cách hiểu của đa số mọi người ở đây.
Trong các ngôn ngữ bậc thấp, khi bạn khai báo một biến trong chương trình thì nghĩa là chương trình đó đã
xí trong bộ nhớ một khoảng vừa đủ để chứa dữ liệu tương lai của cái biến đấy. Trong ngôn ngữ C hay C++, nếu chương trình khai báo một biến X kiểu int đồng nghĩa với việc chương trình đó xí ngay một chỗ rộng 4 byte (hay 2 byte) gì đó trên RAM. Và một điều khá buồn cười là dù chưa làm ăn gì với cái biến X đó thì rất có thể nó đã chứa sẵn một giá trị ngẫu nhiên rồi chứ hổng phải là giá trị 0 mặc định như trong nhiều ngôn ngữ khác. Giá trị ngẫu nhiên này chính là những gì còn sót lại trong ô nhớ RAM trước đó mà cái biến X vô tình được cấp lại đúng các ô nhớ này. Bởi thế với C/C++, khởi tạo các giá trị cụ thể cho biến nào đó là điều giúp chương trình tránh được những lỗi logic đau đầu.
Với các ngôn ngữ bậc cao hơn chẳng hạn như VB, người ta làm sẵn cái khâu khởi tạo này. Chẳng hạn trong VB, tôi khai báo biến X kiểu đồng nghĩa với 2 việc:
[1] cấp phát bộ nhớ
[2] đưa dữ liệu vùng nhớ đó về giá trị mặc định là 0.
Với các kiểu dữ liệu phức tạp hơn nhưng struct, object, thì chắc hẳn sẽ có nhiều bước phức tạp và trình biên dịch tạo ra một cơ chế đặc thù quản lý các biến có kiểu này.
Bởi thế ở cái thời dung lượng RAM máy tính chỉ tính bằng MB (tương đương 0.1-0.4% dung lượng bộ nhớ tiêu chuẩn bây giờ), VB6 bắt buộc bạn bỏ đi những biến không bao giờ dùng đến khi biên dịch nhằm tối ưu việc sử dụng bộ nhớ (vì cứ khai báo là nó chiếm bộ nhớ rồi). Việc giải phóng bộ nhớ nếu có chỉ xẩy ra khi ta bước ra khỏi vùng có khai báo biến đó nhưng thực chất cũng chả có cái "giải phóng bộ nhớ" đúng nghĩa bao giờ. Các dẫy ô nhớ có độ dài khác nhau đã được cấp phát trước đó dù không còn dùng đến vẫn
khó được thu hồi lại và dẫn đến hiện tượng phân mảnh RAM.
Và cách giải quyết cho tình huống đau đầu này chính là tăng dung lượng RAM. Từ dung lượng tính bằng đơn vị KB, sau nhiêu năm đã nhẩy lên MB và nay là GB, mỗi lần thay đổi đơn vị tính, dung lượng RAM lại tăng thêm hơn 1000 lần. Các máy hoạt động càng lâu, đóng mở nhiều app, nhiều thread tương đương với việc khai báo nhiều biến.. thì càng phải dự phòng một bộ nhớ càng lớn. Điều này không chỉ xẩy ra với Windows mà còn là sự đau đầu của Android. Trong Android có một app tối ưu sử dụng RAM nhưng chỉ có thể kích hoạt bằng tay con người chứ Android cũng hổng dám tự động giải quyết. Tuy nhiên hệ điều hành của Apple giải quyết tương đối thành công vấn đề này cho nên RAM trong các thiết bị của Apple thường chỉ bằng 1/2 thậm chí là 1/4 dung lượng RAM các thiết bị có hiệu năng tương đương chạy hệ điều hành khác.
Chốt lại, "Giải phóng bộ nhớ" chỉ là khái niệm tồn tại trong đầu chúng ta chứ chả có trong máy tính trừ khi restart. Bạn đã khai báo một biến bất kỳ thì nó nghiễm nhiên chiếm đủ số bộ nhớ tiêu chuẩn dành cho nó dù có dùng đến hay không. Bác nào có thể giải quyết vấn nạn "chiếm dụng bộ nhớ vô ích" triệt để thì Microsoft, Google... thậm chí Apple sẽ đưa hẳn chuyên cơ đón bác cùng dòng họ qua Mỹ.