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; }