138 Godzina 9
Widać tutaj analogię z telefonem. Możesz zaprogramować swój telefon tak, aby pamiętał wiele numerów. Wystarczy nacisnąć przycisk (wskaźnik) aby zadzwonić do wybranej osoby. Nie musisz pamiętać numeru telefonu (czyli jakby adresu w pamięci) ani miejsca, w którym znajduje się dany telefon (obszar w pamięci). Podobnie jest z danymi na stercie. Nie musisz wiedzieć gdzie one faktycznie w pamięci są, wystarczy Ci wskaźnik.
Stos, w momencie wyjścia z funkcji, jest automatycznie czyszczony. Wszystkie zmienne lokalne są wyrzucane z pamięci. Dane na stercie trwają aż do zakończenia programu. Jest możliwość zwolnienia zarezerwowanej pamięci, jeśli nie jest ona już potrzebna.
Zaletą sterty, jest fakt, że pamięć w niej zarezerwowana jest dostępna tak długo, aż sam jej bezpośrednio nie zwolnisz. Jeśli zarezerwujesz pamięć na stercie wewnątrz funkcji to po zakończeniu funkcji, będzie ona nadal zarezerwowana.
Zaletą takiego dostępu do pamięci w stosunku do wykorzystywania zmiennych globalnych jest możliwość dostępu tylko przez te funkcje, które mają dostęp do wskaźnika danego obszaru. Gwarantuje to spójność dostępu do danych i eliminuje problem niepożądanej modyfikacji danych przez niepowołane do tego funkcje.
Aby móc wykorzystywać pamięć na stercie musisz mieć możliwość stworzenia wskaźnika do obszaru na stercie i przekazania tego wskaźnika do wybranych funkcji. W dalszym ciągu rozdziału opiszemy jak to zrobić.
Do alokacji (rezerwacji) pamięci służy w C++ słowo kluczowe new. Następuje po nim nazwa typu obiektu dla którego rezerwujemy pamięć. Dzięki temu kompilator wie, ile pamięci ma zarezerwować. Dlatego new unsigned short int zarezerwuje 2 bajty na stercie, natomiast new long zarezerwuje 4 bajty.
Wartością zwracaną przez new jest adres w pamięci. Musi on być przypisany do wskaźnika. Żeby stworzyć na stercie miejsce dla zmiennej unsigned short int możesz napisać tak:
unsigned short int * pWskaznik; pWskaznik = new unsigned short int;
Oczywiście można tę operację zapisać krócej:
unsigned short int * pWskaznik = new unsigned short int;
W obu przypadkach, pWskaznik wskazuje na stercie na wartość typu unsigned short int. Możesz ten wskaźnik wykorzystywać dokładnie tak, jak wskaźnik na zmienną i dowolnie przypisywać wartości do pamięci:
*pWskaznik = 72;
Oznacza to: „Wstaw 72 pod adres wskazywany przez pWskaznik” albo „Przypisz 72
do obszaru wskazywanego przez pWskaznik”.
Widać tutaj analogię z telefonem. Możesz zaprogramować swój telefon tak, aby pamiętał wiele numerów. Wystarczy nacisnąć przycisk (wskaźnik) aby zadzwonić do wybranej osoby. Nie musisz pamiętać numeru telefonu (czyli jakby adresu w pamięci) ani miejsca, w którym znajduje się dany telefon (obszar w pamięci). Podobnie jest z danymi na stercie. Nie musisz wiedzieć gdzie one faktycznie w pamięci są, wystarczy Ci wskaźnik.
Stos, w momencie wyjścia z funkcji, jest automatycznie czyszczony. Wszystkie zmienne lokalne są wyrzucane z pamięci. Dane na stercie trwają aż do zakończenia programu. Jest możliwość zwolnienia zarezerwowanej pamięci, jeśli nie jest ona już potrzebna.
Zaletą sterty, jest fakt, że pamięć w niej zarezerwowana jest dostępna tak długo, aż sam jej bezpośrednio nie zwolnisz. Jeśli zarezerwujesz pamięć na stercie wewnątrz funkcji to po zakończeniu funkcji, będzie ona nadal zarezerwowana.
Zaletą takiego dostępu do pamięci w stosunku do wykorzystywania zmiennych globalnych jest możliwość dostępu tylko przez te funkcje, które mają dostęp do wskaźnika danego obszaru. Gwarantuje to spójność dostępu do danych i eliminuje problem niepożądanej modyfikacji danych przez niepowołane do tego funkcje.
Aby móc wykorzystywać pamięć na stercie musisz mieć możliwość stworzenia wskaźnika do obszaru na stercie i przekazania tego wskaźnika do wybranych funkcji. W dalszym ciągu rozdziału opiszemy jak to zrobić.
Do alokacji (rezerwacji) pamięci służy w C++ słowo kluczowe new. Następuje po nim nazwa typu obiektu dla którego rezerwujemy pamięć. Dzięki temu kompilator wie, ile pamięci ma zarezerwować. Dlatego new unsigned short int zarezerwuje 2 bajty na stercie, natomiast new long zarezerwuje 4 bajty.
Wartością zwracaną przez new jest adres w pamięci. Musi on być przypisany do wskaźnika. Żeby stworzyć na stercie miejsce dla zmiennej unsigned short int możesz napisać tak:
unsigned short int * pWskaznik; pWskaznik = new unsigned short int;
Oczywiście można tę operację zapisać krócej:
unsigned short int * pWskaznik = new unsigned short int;
W obu przypadkach, pWskaznik wskazuje na stercie na wartość typu unsigned short int. Możesz ten wskaźnik wykorzystywać dokładnie tak, jak wskaźnik na zmienną i dowolnie przypisywać wartości do pamięci:
‘pWskaznik = 72;
Oznacza to: „Wstaw 72 pod adres wskazywany przez pWskaznik" albo „Przypisz 72 do obszaru wskazywanego przez pWskaznik".