Alokowanie i zwalnianie pamięci

Operator new oraz new []

Operatory new oraz new [] służą do operowania na zmiennych/tablicach dynamicznych działają podobnie jak funkcje malloc w C. Stosuje się je do odpowiednio:

  • new - przydzielania pamięci dla pojedynczej zmiennej/obiektu.
  • new typ_obiektu[ilość_obiektów] - tworzenia tablic zmiennych/obiektów.

Operator delete oraz delete []

Odpowiednio po użyciu operatorów new/new [] stosuje się operatory delete oraz delete [] do zwolnienia wcześniej przydzielonej pamięci:

  • delete - operator zwalnia pamięć jednej zmiennej zadeklarowanej przy pomocy new
  • delete [] - operator zwalnia całą tablicę zadeklarowaną przy pomocy new [].

Użycie zarówno delete oraz delete [] nie wymaga podania typu zmiennej/tablicy do zwolnienia.

#include <iostream>
 
using namespace std;
 
int main( ){
   int *ptr_liczba = new int;
   double *ptr_tablica = new double [3];
 
   *ptr_liczba= 21;
   ptr_tablica[0] = 0.5;
   ptr_tablica[1] = 1.9;
   ptr_tablica[2] = 4.2;
 
   cout << "liczba: " << *liczba << endl;
   cout << "tablica[0]: " << tablica[0];
   cout << "tablica[1]: " << tablica[1];
   cout << "tablica[2]: " << tablica[2];
 
   delete liczba;
   delete [] tablica;
 
   return 0;
}

Program najpierw przydziela pamięć dla zmiennej ptr_liczba za pomocą operatora new, a następnie przydziela tablicę trzyelementową typu double dla zmiennej ptr_tablica. Na końcu zwalniamy pamięć stosując odpowiednie operatory. Kolejność wystąpienia operatorów delete nie jest ważna dopóki zmienne nie są ze sobą powiązane.
Ilustruje to następny przykład.
int main( ){
   int **ptr_tablica = new int*[2];
 
   ptr_tablica[0] = new int[10];
   ptr_tablica[1] = new int[10];
 
   delete [] ptr_tablica;
   delete [] ptr_tablica[0];
   delete [] ptr_tablica[1];
}

Powyższy program rezerwuje tablicę wskaźników typu int (tablicę dwuwymiarową). Następnie przydziela pamięć (tablicę) każdemu z wierszy tablicy. Deklaracja taka jest równoważna zadeklarowaniu statycznej tablicy dwuwymiarowej:

int tablica[2][10]

Program jest błędnie napisany gdyż kolejność wywołania operatorów delete[] jest niewłaściwa. W takich przypadkach kolejnoć wywołania jest odwrotna. Program powinien być więc napisany tak:

int main( ){
   int **ptr_tablica = new int*[2];
 
   ptr_tablica[0] = new int[10];
   ptr_tablica[1] = new int[10];
 
   delete [] ptr_tablica[0];
   delete [] ptr_tablica[1];
   delete [] ptr_tablica;
}
O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License