Bộ nhớ động với new
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 6 trên 56.
Đến nay, bạn đã làm việc với các con trỏ trỏ đến những biến đã được tạo trong chương trình. Nhưng nếu bạn cần tạo biến trong khi chương trình đang chạy thì sao? Đây là lúc cấp phát bộ nhớ động bằng từ khóa new trở nên cần thiết.
Từ khóa new cho phép bạn cấp phát bộ nhớ cho một biến trên heap trong khi chương trình chạy. Khác với các biến thông thường được tạo trên stack, bộ nhớ được cấp phát động sẽ tồn tại cho đến khi bạn giải phóng nó một cách tường minh.
int* ptr = new int; // Cấp phát bộ nhớ cho một số nguyên (integer)
*ptr = 42; // Gán một giá trị (value) vào vùng nhớ đã cấp phátTrong ví dụ này, new int cấp phát đủ bộ nhớ để lưu một số nguyên và trả về con trỏ đến vị trí bộ nhớ đó. Sau đó, bạn có thể dùng toán tử giải tham chiếu để gán giá trị và truy cập biến được cấp phát động giống như mọi con trỏ khác.
Cấp phát bộ nhớ động đặc biệt hữu ích khi bạn chưa biết cần bao nhiêu bộ nhớ cho đến khi chạy chương trình, hoặc khi cần biến tồn tại ngoài phạm vi tạo ra chúng. Tính linh hoạt này khiến new trở thành công cụ mạnh mẽ để xây dựng các chương trình phức tạp hơn.
Thử thách
DễTạo một chương trình minh họa cách cấp phát bộ nhớ động (dynamic memory allocation) bằng từ khóa new để cấp phát bộ nhớ cho một biến trong khi chương trình chạy.
Chương trình sẽ nhận đầu vào sau:
- Một giá trị số nguyên để lưu vào vùng bộ nhớ được cấp phát động
Chương trình của bạn cần:
- Dùng từ khóa
newđể cấp phát động bộ nhớ cho một số nguyên - Lưu con trỏ mà
newtrả về vào một biến con trỏ có tênnumPtr - Dùng toán tử giải tham chiếu để gán giá trị đầu vào vào vùng bộ nhớ được cấp phát động
- In giá trị được lưu trong vùng bộ nhớ được cấp phát động bằng cách giải tham chiếu con trỏ
- In địa chỉ bộ nhớ được lưu trong con trỏ
Dùng định dạng đầu ra chính xác sau:
Value: [value]
Address: [memory address]Địa chỉ bộ nhớ sẽ hiển thị ở định dạng thập lục phân. Đây là cách C++ hiển thị địa chỉ bộ nhớ của vùng bộ nhớ được cấp phát động.
Tự làm thử
#include <iostream>
using namespace std;
int main() {
// Đọc đầu vào
int value;
cin >> value;
// TODO: Viết code của bạn bên dưới
// Dùng 'new' để cấp phát bộ nhớ động cho một số nguyên
// Lưu con trỏ vào biến có tên 'numPtr'
// Gán giá trị đầu vào vào vùng nhớ vừa cấp phát động
// In ra kết quả
cout << "Value: " << /* Truy cập giá trị mà numPtr trỏ tới tại đây */ << endl;
cout << "Address: " << /* In ra địa chỉ lưu trong numPtr */ << endl;
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