Quản lý bộ nhớ C ++: mới và xóa

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ử newdeletetương ứng.

Toán tử C ++ mới

Các newnhà đ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 intbiến bằng newtoá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 newtoán tử trả về địa chỉ của vị trí bộ nhớ.

Trong trường hợp của một mảng, newtoá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 newtoá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, deletetoá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 intbiế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 deletevậ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 intfloat. 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 floatmả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.

thú vị bài viết...