Poznaj C++ w$ godziny0151

Poznaj C++ w$ godziny0151



140


Godzina 9

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: }

EFEKT DZIAŁANIA:

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ł.

Utrata obszarów na stercie

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:

Godzina 9

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: }

EFEKT DZIAŁANIA:

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ł.

Utrata obszarów na stercie

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:


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0048 32 Godzina 3 32 Godzina 3 ANALIZA: W linii 4 deklarowana jest zmienna mala
Poznaj C++ w$ godziny0146 Wskaźniki 135 Wskaźniki 135 ANALIZA: W tym programie deklarujemy dwie zmie
Poznaj C++ w$ godziny0166 Referencje 155 Referencje 155 ANALIZA: W linii 8 deklarujemy zmienną lokal
Poznaj C++ w$ godziny0046 30 Godzina 3typedef
Poznaj C++ w$ godziny0087 Funkcje 73 27:    int RazyDwa(int zrodło) 28: { 29:  &
Poznaj C++ w$ godziny0098 84 Godzina 6 class Kot { unsigned int jegoWiek; unsigned int jegoWaga;&nbs
Poznaj C++ w$ godziny0099 Proste klasy85 unsigned int Waga; void Miaucz(); Kot.Frisky; Frisky.Wiek =
Poznaj C++ w$ godziny0114 Więcej o klasach 101 32 33 34:    < 35 36 37 38 39 40 41
Poznaj C++ w$ godziny0158 Zaawansowane wykorzystanie wskaźników 147 32:    } 33: 34:
Poznaj C++ w$ godziny0172 Referencje 161 Referencje 161 18 { 19 int temp; 20 21 cout «
Poznaj C++ w$ godziny0182 Zaawansowane referencje i wskaźniki 171 int PobierzWiek() const { return j
Poznaj C++ w$ godziny0188 177Zaawansowane referencje i wskaźniki 18:    ZwyklyKot::Zw
Poznaj C++ w$ godziny0216 Przeciążanie operatorów 207 EFEKT DZIAŁANIA: Compile error! Unable to conv
Poznaj C++ w$ godziny0254 246 Godzina 16 11:    protected: 12:    int
Poznaj C++ w$ godziny0004 Spis rozdziałów Część 1 Wstęp do C++ 1 1 Zaczynamy 3 2 Program w C++ 1
Poznaj C++ w$ godziny0007 VI Poznaj C++ w 24 godziny Przypisywanie wartości do zmiennych
Poznaj C++ w$ godziny0008 Spis treści    vii Zmienne
Poznaj C++ w$ godziny0031 Godzina 2 Program w C++ Zanim zaczniemy dokładnie poznawać szczegóły progr
Poznaj C++ w$ godziny0040 24 Godzina 3 Rysunek 3.1 Schemat pamięci MojaZmienna Nazwa Zmiennej RAM&nb

więcej podobnych podstron