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

m
brak opisu edycji
m (poprawa linków)
mNie podano opisu zmian
 
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:
<pre class="lang-cpp">
int *Wektor = (int*)malloc(sizeof(int)*10);
free(Wektor);
albo w stylu C++:
int *Wektor = new int[10];
delete Wektor;
</pre>
 
 
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:
<pre class="lang-cpp">
int **Wektory = new int *[5];
for( int i**Wektory =0; i<5;new i++int )*[5];
for( int i=0; i<5; i++ )
Wektory[i] = new int [10];
</pre>
 
 
W ten sposób stworzono tablicę dwuwymiarową którą statycznie zadeklarowalibyśmy jako:
<pre class="lang-cpp">
int Wektory[5][10];
</pre>
 
 
Ilość elementów poszczególnych wymiarów nie musi być jednakowa. Można np zadeklarować tablicę taką:
<pre class="lang-cpp">
int **Wektory = new int *[2];
int **Wektory[0] = new int *[52];
Wektory[10] = new int [5];
int **Wektory[1] = new int *[2];
</pre>
 
 
Przy takiej deklaracji pierwszy wiersz ma 5 elementów (tablica) a drugi to jeden element.
Deklaracja tablic więcej wymarowych przebiega podobnie:
<pre class="lang-cpp">
int ***Wektory = NULL; // deklarujemy tablicę 3-wymiarową
int ***Wektory = =NULL; new int **[5]; // pierwszydeklarujemy tablicę wymiar3-wymiarową
Wektory[0] = = new int **[105]; // pierwszy element pierwszego wymiaruwymiar
Wektory[10] = new int *[310]; // drugipierwszy element pierwszego wymiaru
Wektory[1] = new int *[3]; // drugi element pierwszego wymiaru
....
Wektory[0][1] = new int [3] // wymiar I = 0 -> wymiar II = 1 -> 3 elementy(tablica)
Wektory[0][31] = new int [53] // wymiar I = 0 -> wymiar II = 31 -> 53 elementówelementy(tablica)
Wektory[10][23] = new int; [5] // wymiar I = 10 -> wymiar II = 23 -> 15 elementelementów(tablica)
Wektory[01][12] = new int; [3] // wymiar I = 01 -> wymiar II = 12 -> 31 elementy(tablica)element
...
</pre>
 
 
Stosując ten algorytm 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:
<pre class="lang-cpp">
int ***Wektory = new int **[2];
int ***Wektory[0] = new int **[2];
Wektory[10] = new int *[2];
Wektory[0][01] = new int *[2]; // pojedyńcza zmienna dynamniczna! nie tablica
Wektory[0][10] = new int [5]; // pojedyńcza zmienna tablicowadynamniczna! nie tablica
Wektory[10][01] = new int [35]; // zmienna tablicowa
Wektory[1][10] = new int [23];
int **Wektory[1][1] = new int *[52];
...
// Kod programu
...
// III wymiar
delete Wektory[0][0]; // kasujemy pojedyńczą zmienną
delete [] Wektory[0][10]; // kasujemy pojedyńczą zmienną
delete [] Wektory[10][01];
delete [] Wektory[1][10];
delete [] Wektory[01][1];
// II wymiar
delete [] Wektory[0];
delete [] Wektory[10];
delete [] Wektory[1];
// I wymiar
delete [] Wektory;
delete [] Wektory;
 
</pre>
 
Zwrócić uwagę trzeba na dwie rzeczy:
 
Drugą zaletą jest fakt, że przy okazji alokacji pamięci możemy wywołać odpowiedni konstruktor inicjalizując wartości zmiennych obiektu, np.
<pre class="lang-cpp">
Test *Test = new Test(1,2);
</pre>
zakładając, że obiekt Test posiada dwie zmienne typu całkowitego i zdefiniowany konstruktor Test(int,int).
 
6422

edycje