Poznaj C++ w$ godziny0150

Poznaj C++ w$ godziny0150



Wskaźniki 139

Jeśli new nie może zarezerwować miejsca na stercie (bądź co bądź pamięć jest niestety ograniczona) to zostanie wywołany wyjątek. Niektóre starsze kompilatory zwrócą nuli. Jeśli korzystasz z takiego kompilatora, to przy rezerwacji pamięci musisz sprawdzić, czy uzyskany wskaźnik nie jest równy nuli.

delete

Kiedy zakończysz operacje na zarezerwowanym obszarze pamięci i nie będziesz już jej więcej wykorzystywać to musisz użyć instrukcji delete na wskaźniku do danego obszaru. Musisz tu koniecznie zwrócić uwagę na ważną rzecz. Wskaźnik zadeklarowany w funkcji jest zmienną lokalną tej funkcji, w przeciwieństwie do pamięci na stercie, na którą wskazuje. Kiedy funkcja się skończy to wskaźnik ten, tak jak wszystkie zmienne lokalne zostanie wyrzucony z pamięci (ze stosu). Oznacza to, że wskaźnika już nie będzie, ale obszar na stercie będzie nadal zarezerwowany. Taki obszar jest już dla programu niedostępny. Takie zjawisko określane jest jako ulatnianie się pamięci. Tak zarezerwowana pamięci pozostanie zajęta (i niedostępna) aż do zakończenia się programu.

Żeby zwolnić pamięć na stercie, musisz użyć słowa kluczowego delete. Np.: delete pWskaznik;

Kiedy kasujesz wskaźnik to zwalniasz pamięć wskazywaną przez ten wskaźnik. Taka pamięć będzie mogła być zarezerwowana przez kolejną instrukcję new. Sam wskaźnik nadal pozostaje wskaźnikiem i będzie można mu ponownie przypisać jakiś inny adres. Listing 9.4. demonstruje rezerwowanie miejsca na stercie, wykorzystanie takiego obszaru i zwolnienie go.

Kiedy wywołujesz delete to zwalniana jest pamięć wskazywana przez dany wskaźnik. Próba ponownego zwolnienia już zwolnionej pamięci spowoduje przerwanie programu!. Pamiętaj, kiedy kasujesz wskaźnik przypisz mu, po skasowaniu, wartość 0 (nuli). Wywołanie delete na zerowym wskaźniku jest bezpieczne i nie spowoduje przerwania programu. Np.:

Zwierze *pPies    = new Zwierze;

delete pPies;    //    zwolnienie pamięci

pPies =0;    //    wyzerowanie wskaźnika

//. .

delete pPies;    //    niegroźne


Listing 9.4. Rezerwacja i zwalnianie pamięci

1:    // Listing 9.4

2:    // Rezerwacja i zwalnianie pamięci

3:

4:    #include <iostream.h>5: int main()

Jeśli new nie może zarezerwować miejsca na stercie (bądź co bądź pamięć jest niestety ograniczona) to zostanie wywołany wyjątek. Niektóre starsze kompilatory zwrócą nuli. Jeśli korzystasz z takiego kompilatora, to przy rezerwacji pamięci musisz sprawdzić, czy uzyskany wskaźnik nie jest równy nuli.

delete

Kiedy zakończysz operacje na zarezerwowanym obszarze pamięci i nie będziesz już jej więcej wykorzystywać to musisz użyć instrukcji delete na wskaźniku do danego obszaru. Musisz tu koniecznie zwrócić uwagę na ważną rzecz. Wskaźnik zadeklarowany w funkcji jest zmienną lokalną tej funkcji, w przeciwieństwie do pamięci na stercie, na którą wskazuje. Kiedy funkcja się skończy to wskaźnik ten, tak jak wszystkie zmienne lokalne zostanie wyrzucony z pamięci (ze stosu). Oznacza to, że wskaźnika już nie będzie, ale obszar na stercie będzie nadal zarezerwowany. Taki obszar jest już dla programu niedostępny. Takie zjawisko określane jest jako ulatnianie się pamięci. Tak zarezerwowana pamięci pozostanie zajęta (i niedostępna) aż do zakończenia się programu.

Żeby zwolnić pamięć na stercie, musisz użyć słowa kluczowego delete. Np.: delete pWskaznik;

Kiedy kasujesz wskaźnik to zwalniasz pamięć wskazywaną przez ten wskaźnik. Taka pamięć będzie mogia być zarezerwowana przez kolejną instrukcję new. Sam wskaźnik nadal pozostaje wskaźnikiem i będzie można mu ponownie przypisać jakiś inny adres. Listing 9.4. demonstruje rezerwowanie miejsca na stercie, wykorzystanie takiego obszaru i zwolnienie go.


Kiedy wywołujesz delete to zwalniana jest pamięć wskazywana przez dany wskaźnik. Próba ponownego zwolnienia już zwolnionej pamięci spowoduje przerwanie programu!. Pamiętaj, kiedy kasujesz wskaźnik przypisz mu, po skasowaniu, wartość 0 (nuli). Wywołanie delete na zerowym wskaźniku jest bezpieczne i nie spowoduje przerwania programu. Np.:

Zwierze *pPies    = new Zwierze;

delete pPies;    //    zwolnienie pamięci

ppies =0;    //    wyzerowanie wskaźnika

//..

delete pPies;    //    niegroźne


Listing 9.4. Rezerwacja i zwalnianie pamięci

1:

//

Listing 9.4

2: 3.

II

Rezerwacja i zwalnianie

pamięci

4:

ginclude <iostream.h>5: int

main ()

6:

<


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0142 Wskaźniki 131Przypisywanie adresu do wskaźnika Jak już mówiliśmy, każda zm
Poznaj C++ w$ godziny0140 Wskaźniki 129 Wskaźniki 129 13 14 15 16 17 18 cout « "longVar: "
Poznaj C++ w$ godziny0144 Wskaźniki 133 Operator dostępu pośredniego ( * ) jest używany w dwóch różn
Poznaj C++ w$ godziny0146 Wskaźniki 135 Wskaźniki 135 ANALIZA: W tym programie deklarujemy dwie zmie
Poznaj C++ w$ godziny0148 Wskaźniki 137Dlaczego będziemy wykorzystywać wskaźniki? Jak dotąd, krok po
Poznaj C++ w$ godziny0152 Wskaźniki 141 1:    unsigned short
S5001352 66 tym ważne jest, żeby bez wcześniejszego uzgodnienie nie próbować ich zmieniać. Jeśli dzi
JEŚLI NIC NIE MOŻE POWSTRZYMAĆ LUDZI PRZED HANDLOWANIEM... ...DOPÓKI NIE WYCZERPIĄ SIĘ WSZYSTKI
Poznaj C++ w$ godziny0243 Dziedziczenie 235 Ten program nie wypisuje nic na ekranie, gdyż jest jedyn
WŁODZIMIERZ SOŁO WIE W. 315 Kościół Chrystusów nie może być ugruntowany na demokraty! Ł-J ..Skoro
NDIGDRUK00570716 10 w swym kraju nie może być prorokiem, na licznych oponentów. W celu udowodnienia
Instrukcja obslugi COLT CZ5 0 lyy    tuMiA OSTRZEŻENIE • ODWRÓCONY FOTELIK DLA DZIE
Obraz8 (48) wołująca stan frustracji, ewentualnie - w przypadku gdy nie może jej skierować na tę os
Finanse p stwa Wypych52 353 Opodatkowanie przedsiębiorstw liczeń od dochodu nie może przekroczyć war

więcej podobnych podstron