În limbajul C++ alocarea dinamica a memoriei si eliberarea ei
se pot realiza cu operatorii new si
delete. Folosirea acestor operatori
reprezinta o metoda superioara, adaptata programarii orientate obiect.
Operatorul new este un operator unar care returneaza un pointer la
zona de memorie alocata dinamic. În situatia în care nu exista
suficienta memorie si alocarea nu reuseste, operatorul new returneaza pointerul
NULL. Operatorul delete elibereaza zona de memorie spre care pointeaza
argumentul sau.
Sintaxa:
tipdata_pointer = new tipdata;
tipdata_pointer = new tipdata(val_initializare);
//pentru initializarea datei pentru care se aloca memorie dinamica
tipdata_pointer = new tipdata[nr_elem]; //alocarea memoriei pentru
un tablou
delete tipdata_pointer;
delete [nr_elem] tipdata_pointer; //eliberarea memoriei pentru
tablouri
Tipdata reprezinta tipul datei (predefinit sau obiect) pentru care se aloca dinamic memorie, iar tipdata_pointer este o variabila pointer catre tipul tipdata.
Pentru a putea afla memoria RAM disponibila la un moment dat, se poate
utiliza functia coreleft:
unsigned coreleft(void);
Exercitiu: Sa se aloce dinamic memorie pentru o data de tip întreg:
int *pint;
pint=new int;
//prelucrari cu *pint
delete pint;
Exercitiu: Sa se aloce dinamic memorie pentru o data reala, dubla precizie,
initializând-o cu valoarea -7.2.
double *p;
p=new double(-7.2);
//prelucrari cu *p
delete p;
Exercitiu: Sa se aloce dinamic memorie pentru un vector de m elemente
reale.
double *vector;
vector=new double[m];
//prelucrari cu vector de exemplu vector[3]=4 etc.
delete [m] vector; // delete vector va dezaloca numai prima componenta
Exercitiu: Sa se aloce dinamic memorie pentru o matrice cu 3 linii
si 5 coloane de tip double.
double (*a)[5]=new double [3][5];
//prelucrari cu a de exemplu a[2][2]==4.9 etc.
delete [3] a;
Exercitiu: Sa se aloce dinamic memorie pentru o structura cu doua campuri: unul intreg iar celelat de tip caracter:
struct articol
{int nr;
char c;
};
articol *pa;
pa=new articol;
cout<<endl<<"nr=";cin>>pa->nr;
cout<<endl<<"caracterul ";cin>>pa->c;
cout<<endl<<pa->nr<<" "<<pa->c<<"
tot la adresa "<<pa<<endl;
delete pa;
Probleme propuse:
Cititi si afisati variabile alocate dinamic de tip numeric. determinati dublul acestora
Cititi si afisati tablouri uni si bidimensionale alocate dinamic
Cititi si afisati variabile de tip struct alocate dinamic. De exemplu informatii despre un produs.
Pentru fiecare eliberati spatiul de memorie.
Se da un numar natural p. Sa se determine daca numarul contine in scrierea
lui secventa 15. de exemplu:
p=141510 contine
p=141051 nu contine
N pitici asezati unul in spatele celuilalt poarta caciuli rosii sau
albe. Gasiti cel mai lung subsir de pitici alaturati care au caciula de
aceeasi culoare. afisati al catelea din cei n pitici este primul pitic
din acest subsir si cati pitici formeaza subsirul. Folositi un vector alocat
dinamic.