C++/Zarządzanie pamięcią: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Nie podano opisu zmian
Lethern (dyskusja | edycje)
poprawki
Linia 3:
Rozważmy prosty przykład. Załóżmy, że chcemy stworzyć wektor 10 liczb typu całkowitego. Możemy to zrobić na dwa sposoby. W stylu znanym z języka C:
<source lang="cpp">
int *Wektorwektor = (int*) malloc (sizeof(int)*10);
free (Wektorwektor);
</source>
 
Albo w stylu C++:
<source lang="cpp">
int *Wektorwektor = new int[10];
delete [] Wektorwektor;
</source>
 
Od razu widać, że drugi zapis jest zdecydowanie łatwiejszy i przyjemniejszy w użyciu. To jest podstawowa zaleta operatora new - krótszy zapis. Wystarczy wiedzieć jakiego typu ma być obiekt, który chcemy powołać do życia, nie martwiąc się o rozmiar alokowanego bloku pamięci. Za pomocą operatora new można również tworzyć tablice wielowymiarowe:
 
Od razu widać, że drugi zapis jest zdecydowanie łatwiejszy i przyjemniejszy w użyciu. To jest podstawowa zaleta operatora new - krótszy zapis. Wystarczy wiedzieć jakiego typu ma być obiekt, który chcemy powołać do życia, nie martwiąc się o rozmiar alokowanego bloku pamięci. Za pomocą operatora new można również tworzyć tablice wielowymiarowe:
<source lang="cpp">
int **Wektorywektory = new int *[5];
for( (int i = 0; i < 5; ++i )
Wektorywektory[i] = new int [10];
</source>
 
W ten sposób stworzono tablicę dwuwymiarową którą statycznie zadeklarowalibyśmy jako:
<source lang="cpp">
int Wektorywektory[5][10];
</source>
 
Jenak w przeciwieństwie do <code>int Wektorywektory[5][10]</code>, która jest tablicą dwuwymiarową, nasze <code>int **Wektorywektory</code> jest tablicą tablic i może być rozrzucone po całej pamięci.
 
 
Ilość elementów poszczególnych wymiarów nie musi być jednakowa. Można np zadeklarować tablicę taką:
<source lang="cpp">
int **Wektorywektory = new int *[2];
Wektorywektory[0] = new int [5];
Wektorywektory[1] = new int;
</source>
 
Linia 40 ⟶ 38:
Deklaracja tablic o większej ilości wymiarów przebiega podobnie:
<source lang="cpp">
int ***Wektorywektory; = NULL; // deklarujemy tablicę 3-wymiarową
Wektorywektory = new int **[5]; // pierwszy wymiar
Wektorywektory[0] = new int *[10]; // pierwszy element pierwszego wymiaru
Wektorywektory[1] = new int *[3]; // drugi element pierwszego wymiaru
....
Wektorywektory[0][10] = new int [3] // wymiar I = 0 -> wymiar II = 1 -> 3 elementy(tablica)
Wektorywektory[0][31] = new int [5] // wymiar I = 0 -> wymiar II = 3 -> 5 elementów(tablica)
Wektorywektory[1][20] = new int; // wymiar I = 1 -> wymiar II = 2 -> 1 element
...
</source>
 
 
Stosując ten algorytmsposób, ogólnie można deklarować tablice n-wymiarowe bez większego problemu.
Usuwanie tablic wielowymiarowych przebiega podobnie jak jednowymiarowych, z tą różnicą, że usuwanie zaczynamy od "najgłębszego" wymiaru:
<source lang="cpp">
delete Wektorywektory[0][0]; // kasujemy pojedynczą zmienną
int ***Wektory = new int **[2];
Wektorydelete [0] = new int *wektory[0][21];
Wektorydelete [1] = new int *wektory[1][20];
Wektory[0][0] = new int; // pojedyncza zmienna dynamniczna! nie tablica
Wektory[0][1] = new int [5]; // zmienna tablicowa
Wektory[1][0] = new int [3];
Wektory[1][1] = new int [2];
...
// Kod programu
...
// III wymiar
delete Wektory[0][0]; // kasujemy pojedynczą zmienną
delete [] Wektory[0][1];
delete [] Wektory[1][0];
delete [] Wektory[1][1];
// II wymiar
delete [] Wektorywektory[0];
delete [] Wektorywektory[1];
// I wymiar
delete [] Wektorywektory;
</source>