140
7: int zmiennaLokalna = 5;
8: int * pLokalna= &zmiennaLokalna;
9: int * pSterta = new int;
10: *pSterta = 7;
11: cout « "zmiennaLokalna: " « zmiennaLokalna « "\n";
12: cout « "*pLokalna: " « *pLokalna « "\n";
13: cout « "*pSterta: " « *pSterta « "\n";
14: delete pSterta;
15: pSterta = new int;
16: *pSterta = 9;
17: cout « "*pSterta: " « *pSterta « "\n";
18: delete pSterta;
19: return 0;
20: }
zmiennaLokalna: 5 *pLokalna: 5 ♦pSterta: 7 ♦pSterta: 9
Linia 7 deklaruje i inicjalizuje zmienną lokalną. Linia 8 deklaruje wskaźnik i inicjalizuje go adresem zmiennej lokalnej. Linia 9 deklaruje kolejny wskaźnik, lecz inicjalizuje go adresem uzyskanym za pomocą new. W ten sposób jest rezerwowane miejsce na stercie dla zmiennej typu int. W linii 10, do stworzonej w pamięci zmiennej przypisujemy wartość 7. Zmienną tę wypisujemy następnie w linii 11. W linii 12 wyświetlamy wartość zawartą pod adresem pLokalna. Zgodnie z oczekiwaniami, obie wyświetlone wartości są takie same. Linia 13 wypisuje wartość zapamiętaną w zarezerwowanym na stercie obszarze. Widać, że wartość przypisana w linii 10 jest dostępna.
W linii 14 pamięć zarezerwowana w linii 9 jest zwalniana za pomocą delete. Wskaźnik pSterta przestał mieć odniesienie do pamięci. Można mu teraz przypisać inny adres. W linii 15 ponownie rezerwujemy pamięć, a jej adres umieszczamy we wskaźniku pSterta. W liniach 16 i 17 zostaje przypisana i wyświetlona na ekranie nowa wartość przechowywana pod adresem pSterta. W linii 18 zarezerwowana pamięć jest zwalniana.
Mimo że w tym konkretnym przypadku linia 18 jest nadmiarowa (koniec programu automatycznie zwolni całą zarezerwowaną pamięć) to dobrym zwyczajem jest zadbanie o to, aby samemu zwolnić, przed zakończeniem programu, całą wykorzystywaną pamięć na stercie. Takie podejście będzie procentować w przyszłości, gdy program będzie się rozrastał.
Innym przypadkiem, w którym tracimy dostęp do zarezerwowanego na stercie obszaru, jest przypisanie nowego adresu do wskaźnika przed zwolnieniem pamięci wskazywanej przez ten wskaźnik. Rozważmy tak fragment programu:
140
7 : int zmiennaLokalna = 5;
8: int * pLokalna= SzmiennaLokalna;
9: int * pSterta = new int;
10; *pSterta = 7;
11; cout « "zmiennaLokalna; " « zmiennaLokalna « “\n";
12; cout « "‘pLokalna: " « ‘pLokalna « "\n";
13: cout « ”*pSterta: ” « ‘pSterta « "\n";
14: delete pSterta;
15: pSterta = new int;
16: ‘pSterta = 9;
17: cout « "‘pSterta: " « ‘pSterta « "\n";
18: delete pSterta;
19: return 0;
20: }
zmiennaLokalna: 5 ‘pLokalna: 5 ‘pSterta: 7 ‘pSterta: 9
ANALIZA
Linia 7 deklaruje i inicjalizuje zmienną lokalną. Linia 8 deklaruje I wskaźnik i inicjalizuje go adresem zmiennej lokalnej. Linia 9 deklaruje kolejny wskaźnik, lecz inicjalizuje go adresem uzyskanym za pomocą new. W ten sposób jest rezerwowane miejsce na stercie dla zmiennej typu int. W linii 10, do stworzonej w pamięci zmiennej przypisujemy wartość 7. Zmienną tę wypisujemy następnie w linii 11. W linii 12 wyświetlamy wartość zawartą pod adresem pLokalna. Zgodnie z oczekiwaniami, obie wyświetlone wartości są takie same. Linia 13 wypisuje wartość zapamiętaną w zarezerwowanym na stercie obszarze. Widać, że wartość przypisana w linii 10 jest dostępna.
W linii 14 pamięć zarezerwowana w linii 9 jest zwalniana za pomocą delete. Wskaźnik pSterta przestał mieć odniesienie do pamięci. Można mu teraz przypisać inny adres. W linii 15 ponownie rezerwujemy pamięć, a jej adres umieszczamy we wskaźniku pSterta. W liniach 16 i 17 zostaje przypisana i wyświetlona na ekranie nowa wartość przechowywana pod adresem pSterta. W linii 18 zarezerwowana pamięć jest zwalniana.
Mimo że w tym konkretnym przypadku linia 18 jest nadmiarowa (koniec programu automatycznie zwolni całą zarezerwowaną pamięć) to dobrym zwyczajem jest zadbanie o to, aby samemu zwolnić, przed zakończeniem programu, całą wykorzystywaną pamięć na stercie. Takie podejście będzie procentować w przyszłości, gdy program będzie się rozrastał.
Innym przypadkiem, w którym tracimy dostęp do zarezerwowanego na stercie obszaru, jest przypisanie nowego adresu do wskaźnika przed zwolnieniem pamięci wskazywanej przez ten wskaźnik. Rozważmy tak fragment programu: