In questo tutorial impareremo a gestire la memoria in modo efficace in C ++ utilizzando nuove operazioni e operazioni di cancellazione con l'aiuto di esempi.
Il C ++ ci consente di allocare la memoria di una variabile o di un array in fase di esecuzione. Questo è noto come allocazione dinamica della memoria.
In altri linguaggi di programmazione come Java e Python, il compilatore gestisce automaticamente le memorie assegnate alle variabili. Ma questo non è il caso in C ++.
In C ++, abbiamo bisogno di deallocare manualmente la memoria allocata dinamicamente dopo che non abbiamo usato la variabile.
Possiamo allocare e quindi deallocare la memoria in modo dinamico utilizzando rispettivamente gli operatori new
e delete
.
Nuovo operatore C ++
L' new
operatore alloca la memoria a una variabile. Per esempio,
// declare an int pointer int* pointVar; // dynamically allocate memory // using the new keyword pointVar = new int; // assign value to allocated memory *pointVar = 45;
In questo caso, abbiamo allocato dinamicamente la memoria per una int
variabile utilizzando l' new
operatore.
Si noti che abbiamo utilizzato il puntatore pointVar per allocare la memoria in modo dinamico. Questo perché l' new
operatore restituisce l'indirizzo della posizione di memoria.
Nel caso di un array, l' new
operatore restituisce l'indirizzo del primo elemento dell'array.
Dall'esempio sopra, possiamo vedere che la sintassi per l'utilizzo new
dell'operatore è
pointerVariable = new dataType;
Elimina operatore
Una volta che non abbiamo più bisogno di utilizzare una variabile che abbiamo dichiarato dinamicamente, possiamo deallocare la memoria occupata dalla variabile.
Per questo, delete
viene utilizzato l' operatore. Restituisce la memoria al sistema operativo. Questo è noto come deallocazione della memoria .
La sintassi per questo operatore è
delete pointerVariable;
Considera il codice:
// 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;
Qui, abbiamo allocato dinamicamente la memoria per una int
variabile utilizzando il puntatore pointVar.
Dopo aver stampato il contenuto di pointVar, abbiamo deallocato la memoria utilizzando delete
.
Nota : se il programma utilizza una grande quantità di memoria indesiderata new
, il sistema potrebbe bloccarsi perché non ci sarà memoria disponibile per il sistema operativo. In questo caso, l' delete
operatore può aiutare il sistema dal crash.
Esempio 1: allocazione dinamica della memoria 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; )
Produzione
45 45.45
In questo programma, abbiamo allocato dinamicamente la memoria a due variabili di int
e float
tipi. Dopo aver assegnato loro dei valori e averli stampati, finalmente si rilasciano le memorie utilizzando il codice
delete pointInt, pointFloat;
Nota: l'allocazione dinamica della memoria può rendere più efficiente la gestione della memoria.
Soprattutto per gli array, dove molte volte non conosciamo la dimensione dell'array fino al tempo di esecuzione.
Esempio 2: C ++ new and delete Operator for Arrays
// 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; )
Produzione
Immettere il numero totale di studenti: 4 Immettere GPA di studenti. Student1: 3.6 Student2: 3.1 Student3: 3.9 Student4: 2.9 Visualizzazione GPA degli studenti. Studente1: 3,6 Studente2: 3,1 Studente3: 3,9 Studente4: 2,9
In questo programma, abbiamo chiesto all'utente di inserire il numero di studenti e di memorizzarlo nella variabile num.
Quindi, abbiamo allocato dinamicamente la memoria per l' float
array utilizzando new.
Inseriamo i dati nell'array (e successivamente li stampiamo) usando la notazione del puntatore.
Dopo che non abbiamo più bisogno dell'array, deallochiamo la memoria dell'array usando il codice delete () ptr;
.
Notare l'uso di ()
after delete
. Usiamo le parentesi quadre ()
per indicare che la deallocazione della memoria è quella di un array.
Esempio 3: C ++ new e delete Operator for Objects
#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.