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.
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
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.
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
1: |
// |
Listing 9.4 | |
2: 3. |
II |
Rezerwacja i zwalnianie |
pamięci |
4: |
ginclude <iostream.h>5: int |
main () | |
6: |
< |