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

brak opisu edycji
Nie podano opisu zmian
Nie 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:
<presource classlang="lang-cpp">
int *Wektor = (int*)malloc(sizeof(int)*10);
free(Wektor);</pre>
</source>
 
Albo w stylu C++:
<presource classlang="lang-cpp">
int *Wektor = new int[10];
delete [] Wektor;
</presource>
 
 
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:
<presource classlang="lang-cpp">
int **Wektory = new int *[5];
for( int i=0; i<5; ++i )
Wektory[i] = new int [10];
</presource>
 
W ten sposób stworzono tablicę dwuwymiarową którą statycznie zadeklarowalibyśmy jako:
<presource classlang="lang-cpp">
int Wektory[5][10];
</presource>
 
AleJenak tak naprawdę, to nieprawda. Ww przeciwieństwie do <code>int Wektory[5][10]</code>, która jest tablicą dwuwymiarową, nasze <code>int **Wektory</code> jest tablicą tablic i może być rozrzucone po całej pamięci. Smuteczek.
 
 
Ilość elementów poszczególnych wymiarów nie musi być jednakowa. Można np zadeklarować tablicę taką:
<presource classlang="lang-cpp">
int **Wektory = new int *[2];
Wektory[0] = new int [5];
Wektory[1] = new int;
</presource>
 
 
Przy takiej deklaracji pierwszy wiersz ma 5 elementów (tablica) a drugi to jeden element.
Deklaracja tablic o większej ilości wymiarów przebiega podobnie:
<presource classlang="lang-cpp">
int ***Wektory = NULL; // deklarujemy tablicę 3-wymiarową
Wektory = new int **[5]; // pierwszy wymiar
Wektory[1][2] = new int; // wymiar I = 1 -> wymiar II = 2 -> 1 element
...
</presource>
 
 
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:
<presource classlang="lang-cpp">
int ***Wektory = new int **[2];
Wektory[0] = new int *[2];
// I wymiar
delete [] Wektory;
</presource>
 
Zwrócić uwagę trzeba na dwie rzeczy:
 
Drugą zaletą jest fakt, że przy okazji alokacji pamięci możemy wywołać odpowiedni konstruktor inicjując wartości zmiennych obiektu, np.
<presource classlang="lang-cpp">
Test *Test = new Test(1,2);
</presource>
zakładając, że obiekt Test posiada dwie zmienne typu całkowitego i zdefiniowany konstruktor Test(int,int).
 
173

edycje