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

Usunięta treść Dodana treść
Nie podano opisu zmian
Gang65 (dyskusja | edycje)
Nie podano opisu zmian
Linia 2:
 
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);
</presource>
 
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
Linia 47 ⟶ 49:
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];
Linia 73 ⟶ 75:
// I wymiar
delete [] Wektory;
</presource>
 
Zwrócić uwagę trzeba na dwie rzeczy:
Linia 83 ⟶ 85:
 
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).