Ebben az oktatóanyagban megtanuljuk hatékonyan kezelni a memóriát a C ++ nyelven, új és törlési műveletek segítségével, példák segítségével.
A C ++ lehetővé teszi számunkra, hogy egy változó vagy egy tömb memóriáját lefuttassuk futási időben. Ez az úgynevezett dinamikus memória-allokáció.
Más programozási nyelvekben, mint például a Java és a Python, a fordító automatikusan kezeli a változókhoz rendelt memóriákat. De a C ++ esetében ez nem így van.
A C ++ - ban manuálisan kell lefoglalnunk a dinamikusan lefoglalt memóriát, miután nem használjuk a változót.
A memóriát dinamikusan lefoglalhatjuk, majd dinamikusan eloszthatjuk a new
és az delete
operátorok segítségével .
C ++ új kezelő
Az new
operátor memóriát rendel egy változóhoz. Például,
// declare an int pointer int* pointVar; // dynamically allocate memory // using the new keyword pointVar = new int; // assign value to allocated memory *pointVar = 45;
Itt dinamikusan rendeltünk memóriát egy int
változóhoz az new
operátor segítségével.
Figyelje meg, hogy a pointVar mutatót használtuk a memória dinamikus lefoglalására. Az new
operátor ugyanis visszaadja a memóriahely címét.
Tömb esetén az new
operátor visszaadja a tömb első elemének címét.
A fenti példából láthatjuk, hogy az new
operátor használatának szintaxisa az
pointerVariable = new dataType;
törli az Operátort
Ha már nincs szükségünk egy dinamikusan deklarált változó használatára, akkor szét tudjuk osztani a változó által elfoglalt memóriát.
Ehhez az delete
operátort használják. Visszaadja a memóriát az operációs rendszerhez. Ez az úgynevezett memória-elosztás .
Ennek az operátornak a szintaxisa a
delete pointerVariable;
Vegye figyelembe a kódot:
// 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;
Itt dinamikusan int
osztottunk memóriát egy változóhoz a pointVar mutató segítségével.
A pointVar tartalmának kinyomtatása után elosztottuk a memóriát delete
.
Megjegyzés : Ha a program nagy mennyiségű nem kívánt memóriát használ fel new
, a rendszer összeomolhat, mert nem lesz memória az operációs rendszer számára. Ebben az esetben az delete
üzemeltető segíthet a rendszer összeomlásában.
1. példa: C ++ dinamikus memóriaallokáció
#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; )
Kimenet
45 45.45
Ebben a programban dinamikusan osztottunk memóriát két változóhoz int
és float
típushoz. Miután hozzárendeltük hozzájuk az értékeket és kinyomtattuk őket, végül a memória kódját használjuk
delete pointInt, pointFloat;
Megjegyzés: A dinamikus memóriakiosztás hatékonyabbá teheti a memóriakezelést.
Különösen tömbök esetében, ahol sokszor nem tudjuk a tömb méretét a futási időig.
2. példa: C ++ új és törölje az Operátort tömbökhöz
// 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; )
Kimenet
Adja meg a hallgatók teljes számát: 4 Írja be a hallgatók GPA-ját. Student1: 3.6 Student2: 3.1 Student3: 3.9 Student4: 2.9 A hallgatók GPA-jának megjelenítése. Tanuló1: 3,6 Tanuló2: 3,1 Tanuló3: 3,9 Tanuló4: 2,9
Ebben a programban arra kértük a felhasználót, hogy adja meg a tanulók számát, és tárolja a num változóban.
Ezután dinamikusan lefoglaltuk a memóriát a float
tömb számára az új felhasználásával.
Adatokat beírunk a tömbbe (és később kinyomtatjuk) mutató jelöléssel.
Miután már nincs szükségünk a tömbre, a kód segítségével elosztjuk a tömb memóriáját delete () ptr;
.
Figyelje meg a ()
after használatát delete
. A szögletes zárójeleket ()
arra használjuk, hogy jelezzük, hogy a memória elosztása egy tömbé.
3. példa: C ++ new és törölje az Operator for Objects alkalmazást
#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.