Diferență între revizuiri ale paginii „C++ POO Operatorii new si delete”
| Linia 97: | Linia 97: | ||
delete[] <nume_pointer>; | delete[] <nume_pointer>; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| + | |||
| + | <div class="regula"><span style="color: red; font-weight: bold">Atenție:</span> pentru memoria alocată dinamic sub forma unui vector, folosind <code>new[]</code>, eliberarea trebuie făcută întotdeauna cu <code>delete[]</code> și nu cu <code>delete</code>. Folosirea lui <code>delete</code> simplu în acest caz este greșită și conduce la comportament nedefinit, deoarece programul nu mai tratează corect memoria rezervată pentru toate elementele vectorului.</div> | ||
== Exemplul 1 - alocarea dinamică a unui vector == | == Exemplul 1 - alocarea dinamică a unui vector == | ||
Versiunea de la data 24 martie 2026 09:46
[WIP Costin] Pagina este in lucru!
Introducere
În programele scrise până acum, majoritatea variabilelor și obiectelor au fost declarate în mod direct, de exemplu:
int x;
Persoana p;
În aceste cazuri, memoria necesară este rezervată automat la intrarea în blocul în care au fost declarate, iar eliberarea ei are loc tot automat la ieșirea din acel bloc. Acest mod de lucru este simplu și sigur, dar nu este întotdeauna suficient.
Există numeroase situații în care un program nu poate ști dinainte de câtă memorie are nevoie. De exemplu:
- numărul de elemente dintr-un vector este citit de la tastatură;
- un obiect trebuie să existe și după terminarea funcției în care a fost creat;
- o clasă trebuie să gestioneze intern resurse a căror dimensiune este variabilă;
- programul trebuie să creeze obiecte dinamic, doar atunci când este nevoie de ele
În astfel de situații apare nevoia de alocare dinamică a memoriei, adică rezervarea memoriei în timpul execuției programului. În C++, acest lucru se realizează cu ajutorul operatorilor new și delete.
Operatorul new
Operatorul new este folosit pentru a rezerva memorie dinamică și, în cazul obiectelor, pentru a construi obiectul în acea zonă de memorie (prin apelarea constructorului).
Forma generală pentru new este următoarea:
<tip_de_date> <nume_pointer> = new <tip_de_date>;
Această linie:
- rezervă memorie pentru o variabilă de tipul specificat;
- returnează adresa acelei zone de memorie;
- memorează adresa într-un pointer de tip corespunzător
Dacă se dorește și inițializare:
<tip_de_date> <nume_pointer> = new <tip_de_date>(<valoare_initiala>);
În plus față de varianta anterioară, această linie inițializează cu <valoare_initiala> valoarea stocată în memoria alocată.
Operatorul delete
Operatorul delete este folosit pentru a distruge obiectul creat dinamic (prin apelarea destructorului) și pentru a elibera memoria ocupată de acesta.
Forma generală pentru delete este următoarea:
delete <nume_pointer>;
<nume_pointer> = nullptr;
Alocarea dinamică pentru tipuri simple
În această secțiune vor fi prezentate câteva exemple comune de utilizare a operatorilor new și delete cu tipuri de date simple.
Exemplul 1 - alocare dinamică pentru un element de tip int
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg
int* p = new int;
// stocheaza valoarea 10 la adresa stocata in pointerul p
*p = 10;
// afișează valoarea stocată la adresa din pointerul p
cout << *p << endl;
// memoria alocată anterior este eliberată
delete p;
Exemplul 2 - alocare cu inițializare
// declară un pointer p către int si alocă dinamic memorie pentru un număr întreg
// și inițializează valoarea de la acea adresă cu 25
int* p = new int(25);
cout << *p << endl;
delete p;
Exemplul 3 - alocare cu alte tipuri simple
double* x = new double(3.14);
char* c = new char('A');
cout << *x << endl;
cout << *c << endl;
delete x;
delete c;
Alocarea dinamică a vectorilor de date simple
Sintaxa generală este următoarea:
// new
<tip_de_date>* <nume_pointer> = new <tip_de_date>[<numar_elemente>];
// delete
delete[] <nume_pointer>;
new[], eliberarea trebuie făcută întotdeauna cu delete[] și nu cu delete. Folosirea lui delete simplu în acest caz este greșită și conduce la comportament nedefinit, deoarece programul nu mai tratează corect memoria rezervată pentru toate elementele vectorului.Exemplul 1 - alocarea dinamică a unui vector
int n = 5;
int* v = new int[n]; // aloca memorie pentru un vector de int cu 5 elemente
Exemplul 2 - suma numerelor dintr-un vector
// se declara n si se citeste de la tastatura dimensiunea vectorului
int n;
cin >> n;
// se aloca dinamic vectorul de n elemente
int* v = new int[n];
// se citesc de la tastatura elementele vectorului
for (int i = 0; i < n; i++)
cin >> v[i];
// se calculeaza suma tuturor elementelor din vector
int suma = 0;
for (int i = 0; i < n; i++)
suma += v[i];
// afisarea sumei
cout << "Suma = " << suma << endl;
// se elibereaza memoria alocata anterior
delete[] v;
v = nullptr;
Alocarea dinamică a obiectelor
Lorem ipsum dolor sit amet.
Alocarea dinamică a vectorilor de obiecte
Lorem ipsum dolor sit amet.
Obiecte care conțin memorie alocată dinamic
Lorem ipsum dolor sit amet.
Greșeli frecvente și comportamente periculoase
Lorem ipsum dolor sit amet.