C ++ Управление на паметта: ново и изтриване

В този урок ще се научим да управляваме ефективно паметта в C ++, като използваме нови и изтриващи операции с помощта на примери.

C ++ ни позволява да разпределим паметта на променлива или масив по време на изпълнение. Това е известно като динамично разпределение на паметта.

В други езици за програмиране като Java и Python компилаторът автоматично управлява паметта, разпределени към променливи. Но това не е така в C ++.

В C ++ трябва да освободим динамично разпределената памет ръчно, след като не използваме променливата.

Ние можем да отпусне и след това преразпредели памет динамично с помощта на newи deleteоператори съответно.

C ++ нов оператор

На newоператора разпределя памет на променлива. Например,

 // declare an int pointer int* pointVar; // dynamically allocate memory // using the new keyword pointVar = new int; // assign value to allocated memory *pointVar = 45;

Тук имаме динамично разпределена памет за intпроменлива с помощта на newоператора.

Забележете, че използвахме указателя pointVar за динамично разпределение на паметта. Това е така, защото newоператорът връща адреса на местоположението в паметта.

В случай на масив, newоператорът връща адреса на първия елемент от масива.

От примера по-горе можем да видим, че синтаксисът за използване на newоператора е

 pointerVariable = new dataType;

изтриване на оператор

След като вече не е необходимо да използваме променлива, която сме декларирали динамично, можем да освободим паметта, заета от променливата.

За това deleteсе използва операторът. Той връща паметта на операционната система. Това е известно като освобождаване на паметта .

Синтаксисът за този оператор е

 delete pointerVariable;

Помислете за кода:

 // 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;

Тук имаме динамично разпределена памет за intпроменлива, използвайки указателя pointVar.

След отпечатване на съдържанието на pointVar, освободихме паметта с помощта delete.

Забележка : Ако програмата използва голямо количество нежелана памет new, системата може да се срине, защото няма да има налична памет за операционната система. В този случай deleteоператорът може да помогне на системата да се срине.

Пример 1: 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; )

Изход

 45 45,45

В тази програма динамично разпределихме паметта на две променливи от intи floatтипове. След като им присвоим стойности и ги отпечатаме, накрая освобождаваме спомените с помощта на кода

 delete pointInt, pointFloat;

Забележка: Динамичното разпределение на паметта може да направи управлението на паметта по-ефективно.

Особено за масиви, където много пъти не знаем размера на масива до времето за изпълнение.

Пример 2: C ++ нов и изтриване на оператор за масиви

 // 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; )

Изход

Въведете общ брой студенти: 4 Въведете GPA на студентите. Студент1: 3.6 Студент2: 3.1 Студент3: 3.9 Студент4: 2.9 Показване на среден успех на студентите. Студент1: 3.6 Студент2: 3.1 Студент3: 3.9 Студент4: 2.9

В тази програма помолихме потребителя да въведе броя на учениците и да го съхрани в променливата num.

След това сме разпределили паметта динамично за floatмасива, използвайки new.

Въвеждаме данни в масива (и по-късно ги отпечатваме), използвайки нотацията на указателя.

След като вече не се нуждаем от масива, освобождаваме паметта на масива, използвайки кода delete () ptr;.

Забележете използването на ()after delete. Използваме квадратните скоби, ()за да обозначим, че освобождаването на паметта е на масив.

Пример 3: C ++ нов и изтриване на оператор за обекти

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

Интересни статии...