В този урок ще се научим да управляваме ефективно паметта в 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.