Trong hướng dẫn này, chúng ta sẽ học cách quản lý bộ nhớ hiệu quả trong C ++ bằng cách sử dụng các thao tác mới và xóa với sự trợ giúp của các ví dụ.
C ++ cho phép chúng ta cấp phát bộ nhớ của một biến hoặc một mảng trong thời gian chạy. Đây được gọi là cấp phát bộ nhớ động.
Trong các ngôn ngữ lập trình khác như Java và Python, trình biên dịch tự động quản lý các bộ nhớ được cấp phát cho các biến. Nhưng đây không phải là trường hợp trong C ++.
Trong C ++, chúng ta cần phân bổ bộ nhớ được cấp phát động theo cách thủ công sau khi chúng ta không sử dụng biến.
Chúng ta có thể cấp phát và sau đó phân bổ bộ nhớ động bằng cách sử dụng toán tử new
và delete
tương ứng.
Toán tử C ++ mới
Các new
nhà điều hành cấp phát bộ nhớ cho một biến. Ví dụ,
// declare an int pointer int* pointVar; // dynamically allocate memory // using the new keyword pointVar = new int; // assign value to allocated memory *pointVar = 45;
Ở đây, chúng ta đã cấp phát động bộ nhớ cho một int
biến bằng new
toán tử.
Lưu ý rằng chúng ta đã sử dụng con trỏ pointVar để cấp phát bộ nhớ động. Điều này là do new
toán tử trả về địa chỉ của vị trí bộ nhớ.
Trong trường hợp của một mảng, new
toán tử trả về địa chỉ của phần tử đầu tiên của mảng.
Từ ví dụ trên, chúng ta có thể thấy rằng cú pháp để sử dụng new
toán tử là
pointerVariable = new dataType;
xóa nhà điều hành
Khi chúng ta không còn cần sử dụng một biến mà chúng ta đã khai báo động nữa, chúng ta có thể phân bổ vùng nhớ bị chiếm bởi biến.
Đối với điều này, delete
toán tử được sử dụng. Nó trả lại bộ nhớ cho hệ điều hành. Đây được gọi là sự phân bổ bộ nhớ .
Cú pháp cho toán tử này là
delete pointerVariable;
Hãy xem xét mã:
// declare an int pointer int* pointVar; // dynamically allocate memory // for an int variable pointVar = new int; // assign value to the variable memory *pointVar = 45; // print the value stored in memory cout << *pointVar; // Output: 45 // deallocate the memory delete pointVar;
Ở đây, chúng ta đã cấp phát động bộ nhớ cho một int
biến bằng cách sử dụng con trỏ pointVar.
Sau khi in nội dung của pointVar, chúng tôi đã phân bổ bộ nhớ bằng cách sử dụng delete
.
Lưu ý : Nếu chương trình sử dụng một lượng lớn bộ nhớ không mong muốn new
, hệ thống có thể bị sập vì sẽ không còn bộ nhớ cho hệ điều hành. Trong trường hợp này, người delete
vận hành có thể giúp hệ thống khỏi sự cố.
Ví dụ 1: Phân bổ bộ nhớ động C ++
#include using namespace std; int main() ( // declare an int pointer int* pointInt; // declare a float pointer float* pointFloat; // dynamically allocate memory pointInt = new int; pointFloat = new float; // assigning value to the memory *pointInt = 45; *pointFloat = 45.45f; cout << *pointInt << endl; cout << *pointFloat << endl; // deallocate the memory delete pointInt, pointFloat; return 0; )
Đầu ra
45 45,45
Trong chương trình này, chúng tôi cấp phát động bộ nhớ cho hai biến kiểu int
và float
. Sau khi gán các giá trị cho chúng và in chúng, cuối cùng chúng tôi phân bổ các bộ nhớ bằng cách sử dụng mã
delete pointInt, pointFloat;
Lưu ý: Cấp phát bộ nhớ động có thể giúp quản lý bộ nhớ hiệu quả hơn.
Đặc biệt là đối với mảng, nơi mà rất nhiều lần chúng ta không biết kích thước của mảng cho đến thời gian chạy.
Ví dụ 2: C ++ mới và xóa toán tử cho mảng
// C++ Program to store GPA of n number of students and display it // where n is the number of students entered by the user #include #include using namespace std; int main() ( int num; cout <> num; float* ptr; // memory allocation of num number of floats ptr = new float(num); cout << "Enter GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 <> *(ptr + i); ) cout << "Displaying GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 << " :" << *(ptr + i) << endl; ) // ptr memory is released delete () ptr; return 0; )
Đầu ra
Nhập tổng số học sinh: 4 Nhập điểm trung bình của học sinh. Student1: 3.6 Student2: 3.1 Student3: 3.9 Student4: 2.9 Hiển thị điểm trung bình của sinh viên. Học sinh1: 3.6 Học sinh2: 3.1 Học sinh3: 3.9 Học sinh4: 2.9
Trong chương trình này, chúng tôi đã yêu cầu người dùng nhập số lượng sinh viên và lưu trữ nó trong biến num.
Sau đó, chúng tôi đã cấp phát bộ nhớ động cho float
mảng bằng cách sử dụng new.
Chúng tôi nhập dữ liệu vào mảng (và sau đó in chúng) bằng cách sử dụng ký hiệu con trỏ.
Sau khi chúng tôi không cần mảng nữa, chúng tôi phân bổ bộ nhớ mảng bằng cách sử dụng mã delete () ptr;
.
Lưu ý việc sử dụng ()
after delete
. Chúng tôi sử dụng dấu ngoặc vuông ()
để biểu thị rằng vị trí thỏa thuận bộ nhớ là của một mảng.
Ví dụ 3: C ++ mới và xóa toán tử cho các đối tượng
#include using namespace std; class Student ( int age; public: // constructor initializes age to 12 Student() : age(12) () void getAge() ( cout << "Age = " << age
Output
Age = 12
In this program, we have created a
Student
class that has a private variable age.
We have initialized age to
12
in the default constructor Student()
and print its value with the function getAge()
.
In
main()
, we have created a Student
object using the new
operator and use the pointer ptr to point to its address.
The moment the object is created, the
Student()
constructor initializes age to 12
.
We then call the
getAge()
function using the code:
ptr->getAge();
Notice the arrow operator
->
. This operator is used to access class members using pointers.