Pamięć przydzielana dynamicznie
Pamięć przydzielana dynamicznie
Czasami istnieje taki problem że nie wiemy ile pamięci będzie nam potrzebne. Na przykład mamy napisać program do sortowania x liczb. Do tego najlepiej nadaje się tablica. Ale żeby zadeklarować tablicę musimy wiedzieć jaki ma być jej rozmiar jeszcze przed skompilowaniem programu. W tedy musimy określić jej górną granicę, a nie musimy jej całej wykożystywać. Ale pojawiają się na dwa aspekty: po pierwsze co zrobić gdy potrzebujemy większą tablicę niż mamy? i po drógie jeżeli wykożystujemy 10 elementów z 10000 to jest to lekkie marnotractwo.
New
C++ daje nam dość proste rozwiązanie tego problemu. Najpierw pytamy się o liczbę elementów tablicy, a następnie twożymy sobie tablcę x wymiarową, jeżeli tylko nam na to pozwala pamięć. Słóży do tego operator new.
Deklaracja takich zmiennych wygląda troszeczkę inaczej niż deklaracja zwykłych zmiennych. Deklaruje się wskaźnik do pamięci przydzielonej dynamicznie.
int *zmienna1 = new int;
char *zmienna2 = new char[rozmiar];
W pierwszym przykładzie zadeklarowaliśmy sobie wskażnik do obszaru pamięci o rozmiarze zmiennej int. Czyli po prostu przydzieliliśmy sobie pamięć dynamicznie. Natomiast w drógim przypadku zadeklarowaliśmy sobie nową tablicę której rozmiar znamy dopiero podczas wykonywania programu. Jest tutaj pewne niebezpieczeństwo. Trzeba się pilnować żeby nie odczytywać z elementu tablicy którego nie zadeklarowaliśmy. Np deklarujemy 7 elementów tabli cy a odczytujemy 10. Czytamy w tedy po prostu pamięć która jest zaraz po naszej tablicy. Jezszcze gorzej jest z takim zapisem! Coś takiego może prowadzić w najlepszym przypadku do nieprawidłowego działania programu.
Delete
Jeżeli mamy przydzieloną pamięć dynamiczną to istnieje możliwość a nawet konieczność jej zwolnienia. Jeżeli jawnie nie zwolnimy pamięci (poprzez ten operator) to fragment pamięci zostanie dla programu stracony, i pomimo że pamięci tej nie będziemy używać, system nie przydzieli jej nam drugi raz. Do zwalniania pamięci służy operator delete.
delete zmienna;delete [] tablica;
Oba nawiasy [] mówią że wskaźnik wskazuje na tablicę danych.
Operator ten służy tylko do zwalniania pamięci przydzielonej dynamicznie. Jeżeli użyjemy tego operatora względem wskaźnika wskazującego na obiekt statyczny, np:
char *zmienna = "jakiś tekst";
delete zmienna;
to efekt takiej operacji będzie bliżej nieokreślony. Jest to takzwane niebezpieczne użycie tego operatora.
Zasięg pamięci i jej koniec
Oczywiście zasięg pamięci nie musi obowiązywać w całym programie. Można przydzielić sobie pamięć tylko dla jednej funkcji w programie, bo akurat taka zaszła potrzeba. W tedy w funkcji2 nie możemy używać zmiennej.
void funkcja1()
{
int *wskaźnik1;
wskaźnik1=new int;
}
void funkcja2()
{
}
Jeżeli skończy się nam pamięć to operator new zwróci nam wartość zero, czyli wskaźnik nie będzie wskazywał na żaden obiekt. Warto to sprawdzać bo może to prowadzić do błędów w programie.
Wyszukiwarka
Podobne podstrony:
6 ŁSkłodowski mosty dynamp dynamC Cpp03 zm dynam przeciazanieSila el dynamSila el dynam wzkAN DYNAMdynamwięcej podobnych podstron