In cazul masivelor, trebuie atentie la eliberarea memoriei (cu delete). Trebuie tinut cont de tipul pointerului, asa cum rezulta din exemplele urmatoare:
Fie vectorul alocat in HEAP
int *a=new int[4];
Daca incercam dezalocarea sa prin:
delete a; ii dezalocam prima componenta, pentru ca pointerul este de tip int*.
Corect, dezalocarea se poate face prin: delete [4] a – eliberam spatiul pentru toate componentele (in acest caz avem 4). Observati ca operatorul delete se poate utiliza si ca mai sus.
Fie matricea alocata in HEAP:
double (*a)[5]= new double [3][5];
Eliberarea spatiului ocupat de ea se face prin delete [3] a;
#include <iostream.h>
main()
{
int m, n, i, j, (*adr)[10];
adr=new int [10][10];
cout<<”m=”; cin>>m;
cout<<”n=”; cin>>n;
for(i=0; i<m; i++)
for(j=0; j<n; j++)
cin>>adr[i][j];
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
cout<<adr[i][j]<<” “;
cout<<endl;
}
}
Alocarea in HEAP nu este lipsita de importanta. De obicei, matricele ocupa mult spatiu in memorie. Faptul ca, de aceasta data ele sunt rezervate in HEAP, conduce la economisirea memoriei din segmentul de date sau acela de stiva. In acest fel programul dispune de mai multa memorie, pentru ca HEAP-ul este oricum rezervat.
Este cunoscut faptul ca functiile nu pot intoarce masive. In schimb, o functie poate intoarce un pointer catre orice tip (void*). Reamintim ca unei variabile de tipul void* I se poate atribui orice tip de pointer, dar atribuirea inversa se poate face doar prin utilizarea operatorului de conversie explicita. Programul urmator citeste doua matrice si afiseaza suma lor. Matricele sunt rezervate in HEAP.
#include <iostream.h>
void* Cit_Mat(int m, int n)
{
int i, j, (*adr1)[10]=new int[10][10];
for(i=0; i<m; i++)
for(j=0; j<n; j++)
cin>>adr1[i][j];
return adr1;
}
void Tip_Mat(int m, int n, int(*adr1)[10])
{
int i, j;
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
cout<<adr1[i][j]<<” “;
cout<<endl;
}
}
void* Suma_Mat(int m, int n, int(*adr1)[10], int(*adr2)[10])
{
int i, j, (*adr)[10]=new int[10][10];
for(i=0; i<m; i++)
for(j=0; j<n; j++) adr[i][j]=adr1[i][j]+adr2[i][j];
return adr;
}
main()
{
int m, n, i, j, (*adr)[10], (*adr1)[10], (*adr2)[10];
cout<<”m=”; cin>>m;
cout<<”n=”; cin>>n;
adr1=(int(*)[10])Cit_Mat(m,n);
adr2=(int(*)[10])Cit_Mat(m,n);
adr=(int(*)[10])Suma_Mat(m,n,adr1,adr2);
Tip_Mat(m,n,adr);
}
Pentru fiecare dintre cele n materiale, aflate intr-o magazie, se cunoaste: denumirea materialului, unitatea de masura (bucati, kg.,etc.) si cantitatea care se gaseste in magazie, exprimata in unitatea de masura inscrisa. Programul de mai jos citeste informatiile si le organizeaza astfel:
segmentul de date contine un vector cu n componente, unde fiecare componenta retine un pointer catre inregistrarea cu datele citite pentru fiecare material;
datele citite pentru fiecare material se organizeaza ca struct, alocat in HEAP.
pv522c7335cvve pv522c7335cvve
#include <iostream.h>
struct material
{
char denumire[20], unit_mas[5];
float cantitate;
};
void Cit_Material(int i, material* v[100])
{
v[i]=new material;
cout<<”Denumire “; cin>>v[i]->denumire;
cout<<”Unitate de masura “; cin>>v[i]->unit_mas;
cout<<”Cantitate “; cin>>v[i]->cantitate;
}
void Tip_Material(int i, material* v[100])
{
cout<<v[i]->denumire<<endl<<v[i]->unit_mas<<endl<<v[i]->cantitate;
}
main()
{
int n, i;
material* v[100];
cout<<”n=”; cin>>n;
for(i=0; i<n; i++) Cit_Material(i,v);
for(i=0; i<n; i++) Tip_Material(i,v);
}