2.4. Alocarea dinamic? a memoriei ?n C++

2.4. Alocarea dinamic? a memoriei ?n C++

?n C++ a fost ad?ugat un mecanism propriu de alocare dinamic? a memoriei, ?n plus la cel de la C. Acest mecanism este realizat prin operatorii new ?i delete. El este mai comod ?i mai laconic dec?t predecesorul s?u.

Operatorul new poate avea una din urm?toarele trei forme:

new tip
new tip(expresie)
new tip[expresie]


?n cea mai simpl? form? operatorul new aloc? memorie din zona de memorie dinamic? heap pentru o variabil? de tipul tip ?i ?ntoarce adresa memoriei alocate ca rezultat. Dac? ?n heap nu este memorie liber? suficient?, operatorul new nu va aloca memorie ?i va ?ntoarce valoarea NULL. De obicei, ?n program adresa returnat? de c?tre operatorul new se atribuie unei variabile-pointer cu tipul de baz? tip. Exemple:

   int *pi;
   pi = new int;
   double *pd = new double;


Folosind mecanismul lui C, acela?i lucru ?n C++ poate fi f?cut cu func?ia malloc astfel:

   int *pi;
   pi = (int *) malloc (sizeof *pi); // sau sizeof (int) 
   double *pd = (double *) malloc (sizeof *pd);
//?n plus, trebuie s? conect?m unul din fi?ierele antet "alloc.h" 
//sau "stdlib.h". 
//Dac? la ambele fragmente vom ad?uga:
   *pi = 24;
   cout << "*pi = " << *pi << endl;
   *pd = 2.52;
   cout << "*pd = " << *pd << endl;
?n ambele cazuri va fi afi?at:
*pi = 24
*pd = 2.52


?n fragmentul ad?ugat endl ?nseamn? trecerea la urm?toarea linie, exact acela?i lucru ca ?i ’\n’.
A doua form? a operatorului new ne permite s? unim alocarea ?i ini?ializarea astfel:

   int *pi;
   pi = new int(24);
   double *pd = new double(2.52);
   cout << "*pi = " << *pi << endl;
   cout << "*pd = " << *pd << endl;


Va fi afi?at acela?i rezultat.

Pentru simplicitate, ?n exemplele precedente nu s-a verificat dac? alocarea memoriei a fost reu?it?. Acest lucru poate fi f?cut ?n mod obi?nuit prin compararea pointerului dup? executarea operatorului new. De exemplu:

   int *pi;
   if( !(pi = new int(24)) )
   {
      cerr << "Eroare de alocare pentru pi\n";
      exit(1);
   }
   cout << "*pi = " << *pi << endl;
   if( double *pd = new double(2.52))
   {  // pointerul pd va fi vizibil numai ?n acest bloc
      cout << "*pd = " << *pd << endl;
      *pd=3.14;
      cout << "*pd = " << *pd << endl;
   }
   else
   {
      cerr << "Eroare de alocare pentru pd\n";
      exit(1);
   }
Dac? ?n ambele cazuri alocarea nu a e?uat, pe ecran va fi afi?at:
*pi = 24
*pd = 2.52
*pd = 3.14


Pentru func?ia exit() am conectat, desigur, "stdlib.h".

A treia form? a operatorului new ne permite s? aloc?m dinamic memoria pentru matrice (vectori). Prin [expresie] indic?m num?rul de elemente de tipul tip pentru care va fi alocat un bloc de memorie consecutiv? din heap. Operatorul new va ?ntoarce adresa primului element, sau NULL, dac? nu este suficient? memorie liber? ?n heap. ?n cazul matricelor, ini?ializarea trebuie s? fie f?cut? aparte. Cercet?m urm?torul exemplu:

   int *v = new int[5]; // aloc?m dinamic un vector din 5
                        // elemente ?ntregi 
   if( !v )
   {
      cerr << "Eroare de alocare pentru vector\n";
      exit(1);
   }
   int i;
   for(i=0; i < 5; i++)
      *(v+i)=i+1; // ini?ializarea elementelor, sau v[i]=i+1;                  
   for(i=0; i < 5; i++)
      cout << v[i] << ” ”; // afi?area elementelor
   cout << endl;
Va fi afi?at:
1 2 3 4 5


Memoria alocat? dinamic dup? utilizare trebuie eliberat? cu operatorul delete.

Operatorul delete poate avea una din urm?toarele dou? forme:

delete pointer
delete []pointer

Pentru a elibera memoria dup? utilizarea ei, ?n exemplele precedente cu new ad?ug?m respectiv:

   delete pi;
   delete pd;
   delete []v;


Atragem aten?ia c? delete cu [] se aplic? la pointeri care au ob?inut valoarea prin new cu []. ?n exemplul cu malloc() eliber?m memoria cu free():

   free(pi);
   free(pd);


Operatorul delete ?ntoarce valoarea void, de aceea el poate fi folosit ?n expresii numai cu operatorul , (virgul?), cum ar fi:

 delete pi, delete pd;


?n mod normal, operatorul delete se aplic? numai la pointeri care con?in adresa ob?inut? preventiv cu new, altfel rezultatul nu este prev?zut ?i poate crea probleme serioase, cum ar fi blocarea programului.

Nu se recomand? combinarea celor dou? mecanisme (C ?i C++) de alocare a memoriei ?ntr-un program; adic?, dac? un bloc de memorie a fost alocat cu new, el trebuie s? fie eliberat cu delete, iar dac? blocul a fost alocat cu malloc(), el trebuie s? fie eliberat cu free(). Altfel func?ionarea corect? a programului nu este garantat?.
_________________________
Autorul: dr.conf. S. Pereteatcu

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов