Giải phóng bộ nhớ với delete
Thuộc phần Logic và luồng chương trình trong hành trình C++ của Coddy. Bài học 7 trên 56.
Khi cấp phát bộ nhớ động bằng new, vùng nhớ đó không tự động biến mất khi bạn dùng xong. Khác với các biến thông thường được tự động dọn dẹp, bộ nhớ được cấp phát động vẫn được sử dụng cho đến khi bạn giải phóng nó một cách tường minh. Đây là lúc từ khóa delete trở nên thiết yếu.
Từ khóa delete giải phóng bộ nhớ đã được cấp phát trước đó bằng new. Khi dùng delete, bạn đang báo cho hệ thống biết rằng bạn đã dùng xong vùng bộ nhớ đó và hệ thống có thể tái sử dụng nó cho mục đích khác:
int* ptr = new int(42); // Cấp phát bộ nhớ
// Sử dụng vùng nhớ...
delete ptr; // Giải phóng bộ nhớQuy tắc cơ bản của việc quản lý bộ nhớ động rất đơn giản: với mỗi new, phải có một delete tương ứng. Nếu bạn quên xóa vùng nhớ được cấp phát động, bạn sẽ gây ra rò rỉ bộ nhớ: chương trình tiếp tục giữ vùng nhớ không còn sử dụng, điều này cuối cùng có thể khiến hệ thống hết bộ nhớ khả dụng.
Sau khi gọi delete trên một con trỏ, con trỏ đó trở nên không hợp lệ và bạn không nên dùng lại. Bạn nên đặt con trỏ thành nullptr sau khi xóa để tránh vô tình sử dụng nó.
Thử thách
DễTạo chương trình minh họa toàn bộ vòng đời của bộ nhớ động bằng cách cấp phát bộ nhớ với new, sử dụng bộ nhớ đó, rồi giải phóng đúng cách bằng delete.
Chương trình sẽ nhận các đầu vào sau:
- Một giá trị số nguyên để lưu vào bộ nhớ được cấp phát động
- Một giá trị số nguyên thứ hai để cập nhật giá trị đã lưu
Chương trình của bạn cần:
- Dùng
newđể cấp phát động bộ nhớ cho một số nguyên và lưu con trỏ vào biến có têndynamicPtr - Gán giá trị đầu vào thứ nhất vào vùng nhớ được cấp phát động bằng toán tử giải tham chiếu
- In giá trị ban đầu được lưu trong vùng nhớ được cấp phát động
- Cập nhật giá trị trong vùng nhớ được cấp phát động thành giá trị đầu vào thứ hai
- In giá trị đã cập nhật
- Dùng
deleteđể giải phóng vùng nhớ được cấp phát động - Đặt con trỏ thành
nullptrsau khi xóa - In thông báo xác nhận rằng bộ nhớ đã được giải phóng
Dùng định dạng đầu ra chính xác sau:
Initial value: [first value]
Updated value: [second value]
Memory freed successfullyTự làm thử
#include <iostream>
using namespace std;
int main() {
// Đọc các giá trị đầu vào
int firstValue, secondValue;
cin >> firstValue;
cin >> secondValue;
// TODO: Viết code của bạn bên dưới
// 1. Cấp phát bộ nhớ bằng new và lưu vào dynamicPtr
// 2. Gán firstValue vào vùng nhớ đã cấp phát
// 3. In ra giá trị ban đầu
// 4. Cập nhật bằng secondValue
// 5. In ra giá trị sau khi cập nhật
// 6. Giải phóng bộ nhớ và đặt con trỏ thành nullptr
// 7. In ra thông báo xác nhận
return 0;
}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 độ.
Tất cả bài học trong Logic và luồng chương trình
1Con trỏ và bộ nhớ
Con trỏ là gì?Toán tử lấy địa chỉToán tử giải tham chiếuCon trỏ nullCon trỏ và mảngBộ nhớ động với newGiải phóng bộ nhớ với deleteÔn tập: luyện tập về con trỏ2Vector (mảng động)
Giới thiệu std::vectorTạo vectorThêm phần tửTruy cập phần tửKích thước vectorDuyệt bằng vòng lặp forVòng lặp for dựa trên phạm viXóa phần tửÔn tập: các thao tác với vector5Dự án: Công cụ quản lý hàng tồn kho
Thiết lập dự ánThêm và cập nhật mặt hàng3Dự án: Công cụ danh sách công việc
Tổng quan dự ánThêm công việc6Tập hợp (các phần tử duy nhất)
Giới thiệu std::setTạo tập hợp và thêm phần tửKiểm tra phần tửXóa phần tửDuyệt qua tập hợpÔn tập: các số duy nhấtTự luyện tập: Trình biên dịch C++ online