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

 // 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 та видалення оператора для об’єктів

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

Цікаві статті...