Управление памятью 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 ++ оператор new и delete для массивов

 // 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 Введите средний балл студентов. Студент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 ++ оператор new и delete для объектов

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

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