Bộ Nhớ động Trong C/C++
Có thể bạn quan tâm
Một sự hiểu biết sâu về cách bộ nhớ động thực sự làm việc trong C/C++ là cốt yếu để trở thành một lập trình viên C/C++ giỏi. Bộ nhớ trong chương trình C/C++ của bạn được phân thành hai phần:
Stack: Tất cả biến được khai báo bên trong hàm sẽ nhận bộ nhớ từ stack trong C/C++.
Heap: Được sử dụng để cấp phát bộ nhớ động khi chương trình chạy.
Nhiều khi, bạn không biết trước bao nhiêu bộ nhớ bạn sẽ cần để lưu thông tin cụ thể trong một biến đã được định nghĩa và kích cỡ bộ nhớ cần thiết có thể được quyết định tại run time.
Bạn có thể cấp phát bộ nhớ tại run time bên trong Heap cho biến đó với một kiểu đã cho bởi sử dụng một toán tử đặc biệt trong C/C++ mà trả về địa chỉ của không gian đã cấp phát. Toán tử này gọi là toán tử new trong C/C++.
Nếu bạn không cần thiết bộ nhớ động đã cấp phát nữa, bạn có thể sử dụng toán tử delete trong C/C++, sẽ giải phóng bộ nhớ đã được cấp phát trước đó bởi toán tử new.
Toán tử new và delete trong C/C++
Đây là cú pháp chung để sử dụng toán tử new để cấp phát bộ nhớ động cho bất kỳ kiểu dữ liệu nào trong C/C++:
new kieu_du_lieu;Ở đây, kieu_du_lieu có thể là bất kỳ kiểu dữ liệu có sẵn nào ví dụ như mảng hoặc các kiểu dữ liệu tự định nghĩa như lớp hoặc cấu trúc. Đầu tiên, chúng ta xét các kiểu dữ liệu có sẵn. Ví dụ, chúng ta có thể định nghĩa một con trỏ tới kiểu double và sau đó yêu cầu rằng bộ nhớ được cấp phát tại thời gian thực thi. Chúng ta có thể làm điều này bởi sử dụng toán tử new trong C/C++ với các lệnh sau:
double* contro = NULL; // con tro duoc khoi tao voi gia tri null contro = new double; // yeu cau bo nho cho bienBộ nhớ có thể chưa được cấp phát thành công, nếu phần bộ nhớ rỗi (free store) đã được sử dụng. Vì thế, đây là bài thực hành tốt cho bạn khi kiểm tra nếu toán tử new trả về con trỏ NULL và thực hiện hành động thích hợp, như sau:
double* contro = NULL; if( !(contro = new double )) { cout << "Error: Het bo nho!" <<endl; exit(1); }Hàm malloc() từ C, vẫn tồn tại trong C/C++, nhưng tôi đề nghị bạn tránh sử dụng hàm malloc() này. Lợi thế lớn nhất của toán tử new so với hàm malloc() là toán tử new không chỉ cấp phát bộ nhớ, nó còn xây dựng đối tượng theo mục đích chính của C/C++.
Tại bất kỳ thời điểm, khi bạn cảm thấy một biến đã được cấp phát động là không cần thiết nữa, bạn có thể giải phóng bộ nhớ mà nó đã chiếm giữ trong phần bộ nhớ rỗi với toán tử delete trong C/C++, như sau:
delete contro; // giai phong bo nho duoc tro boi contro Quảng cáoBây giờ, dựa vào các khái niệm trên chúng tôi tạo một ví dụ minh họa cách toán tử new và delete trong C/C++ làm việc:
#include <iostream> using namespace std; int main () { double* contro = NULL; // con tro duoc khoi tao voi gia tri null contro = new double; // yeu cau bo nho cho bien *contro = 1234.56; // luu giu gia tri tai dia chi da duoc cap phat cout << "Gia tri cua contro la: " << *contro << endl; delete contro; // giai phong bo nho. return 0; }Biên dịch và chạy chương trình C/C++ trên sẽ cho kết quả sau:
Gia tri cua contro la: 1234.56 Quảng cáoCấp phát bộ nhớ động cho Mảng trong C/C++
Giả sử bạn muốn cấp phát bộ nhớ cho một mảng ký tự, ví dụ một chuỗi 20 ký tự. Bạn sử dụng cùng cú pháp đã sử dụng ở trên, như sau:
char* contro = NULL; // con tro duoc khoi tao voi gia tri null contro = new char[20]; // yeu cau bo nho cho bienĐể xóa mảng mà chúng ta vừa tạo, cú pháp trong C/C++ là:
delete [] contro; // xoa mang da duoc tro boi controĐây là cú pháp chung của toán tử new, bạn có thể sử dụng để cấp phát bộ nhớ cho một mảng đa chiều trong C/C++:
double** contro = NULL; // con tro duoc khoi tao voi gia tri null contro = new double [3][4]; // cap phat bo nho cho mang 3x4Tuy nhiên, cú pháp để giải phóng bộ nhớ cho mảng đa chiều vẫn giống ở trên:
delete [] contro; // xoa mang da duoc tro boi contro Quảng cáoCấp phát bộ nhớ động cho Đối tượng trong C/C++
Đối tượng không khác các kiểu dữ liệu đơn giản. Ví dụ: bạn xem xét code sau, trong đó chúng ta đang sử dụng một mảng đối tượng để làm rõ khái niệm này:
#include <iostream> using namespace std; class NhanVien { public: NhanVien() { cout << "Constructor duoc goi!" <<endl; } ~NhanVien() { cout << "Destructor duoc goi!" <<endl; } }; int main( ) { NhanVien* mangNhanVien = new NhanVien[5]; delete [] mangNhanVien; // xoa mang return 0; }Nếu bạn chuẩn bị cấp phát bộ nhớ cho một mảng 5 đối tượng NhanVien, constructor đơn giản trên sẽ được gọi 4 lần và tương tự trong khi xóa các đối tượng, destructor cũng sẽ được gọi với số lần tương tự.
Biên dịch và chạy chương trình C/C++ trên sẽ cho kết quả sau:
Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng....miễn phí. Tải ngay ứng dụng trên Android và iOS.
Theo dõi chúng tôi miễn phí trên mạng xã hội facebook và youtube:
Các bạn có thể mua thêm khóa học JAVA CORE ONLINE VÀ ỨNG DỤNG cực hay, giúp các bạn vượt qua các dự án trên trường và đi thực tập Java. Khóa học có giá chỉ 300K, nhằm ưu đãi, tạo điều kiện cho sinh viên cho thể mua khóa học.
Nội dung khóa học gồm 16 chuơng và 100 video cực hay, học trực tiếp tại https://www.udemy.com/tu-tin-di-lam-voi-kien-thuc-ve-java-core-toan-tap/ Bạn nào có nhu cầu mua, inbox trực tiếp a Tuyền, cựu sinh viên Bách Khoa K53, fb: https://www.facebook.com/tuyen.vietjack
Follow facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.
Bài học C++ phổ biến khác tại vietjack.com:
- Cú pháp C++ cơ bản
- Các kiểu Modifier trong C++
- Toán tử trong C++
- Vòng lặp trong C++
- Lệnh IF, Else, Switch trong C++
- Mảng (Array) trong C++
- Chuỗi (String) trong C++
- Con trỏ trong C++
- Date & Time trong C++
160 bài học ngữ pháp tiếng Anh hay nhất
155 bài học Java tiếng Việt hay nhất
100 bài học Android tiếng Việt hay nhất
247 bài học CSS tiếng Việt hay nhất
197 thẻ HTML cơ bản
297 bài học PHP
101 bài học C++ hay nhất
97 bài tập C++ có giải hay nhất
208 bài học Javascript có giải hay nhất
Từ khóa » Toán Tử New Trong C
-
Toán Tử New, Delete Trong C++ Hoạt động Như Thế Nào, Dùng để Làm Gì?
-
Hàm Delete Và New Trong C Có Nghĩa Gì???
-
Chi Tiết Bài Học Quản Lý Bộ Nhớ Trong C++: New Và Delete - Vimentor
-
[Tự Học C++] Cấp Phát Bộ Nhớ động Với Từ Khóa New Và Delete
-
Con Trỏ Và Cấp Phát động Trong C++ | TopDev
-
Cách Hoạt động Của Lệnh New Trong Ngôn Ngữ Lập Trình C++? - FUNiX
-
Bài 4 Toán Tử New Và Cấp Phát Bộ Nhớ Cho Con Trỏ - YouTube
-
Các Mở Rộng Của C++ - Toán Tử New Và Delete - .vn
-
Sự Khác Biệt Giữa Toán Tử Mới Và Xóa Trong C ++ Là Gì - Strephonsays
-
Sự Khác Biệt Giữa Toán Tử Delete Và Delete[] Trong C++
-
Cấp Phát động Trong C++ (Dynamic Memory Allocation). | How Kteam
-
`New` Trong` New Int; `có được Coi Là Một Toán Tử Không? - HelpEx
-
Toán Tử New Trong Javascript - Viblo
-
Sự Khác Biệt Giữa New Và Malloc ()
-
Cấp Phát Động Trong C++ — Modern C++ - STDIO
-
Bộ Nhớ động Trong C++
-
Toan Tu New C++ | Lội-suố
-
Kỹ Thuật Cấp Phát Bộ Nhớ động Và Minh Họa Với C++ - Góc Học IT
-
Bộ Nhớ động Trong C/C++ - Hoclaptrinh