Menu
CoddyTech

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ó.

challenge icon

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:

  1. 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ên dynamicPtr
  2. 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
  3. In giá trị ban đầu được lưu trong vùng nhớ được cấp phát động
  4. 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
  5. In giá trị đã cập nhật
  6. Dùng delete để giải phóng vùng nhớ được cấp phát động
  7. Đặt con trỏ thành nullptr sau khi xóa
  8. 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 successfully

Tự 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;
}
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 độ.

Tất cả bài học trong Logic và luồng chương trình

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