Pamięć dynamiczna
Pamięć dynamiczna
Dotychczas używając pamięci trzeba było z góry znać jej wielkość, aby zadeklarować odpowiednią strukturę danych. Takie rozwiązanie bywa niewygodne, gdy nie wiemy, z jak dużymi danymi będziemy mieli do czynienia. Często bowiem wraz z danymi pojawia się ich rozmiar dopiero wtedy chcielibyśmy ustalać wielkość struktury danych. Temu celowi służy tzw. pamięć dynamiczna, czyli taka, której rezerwacja i zwalnianie odbywa się w czasie działania programu.
System operacyjny uruchamiając program przeznacza na jego obsługę fragment pamięci, zapewniając wyłączność tak, aby żaden inny proces nie mógł się do niej dostać. W tym fragmencie przydzielonej pamięci mieści się kod programu, dane statyczne (czyli zadeklarowane na etapie deklaracji) oraz dane dynamiczne, czyli takie, dla których pamięć jest rezerwowana i zwalniana na bieżąco. W naszym języku będzie można deklarować zmienne dynamiczne, które będą rozpoznawane dzięki poprzedzeniu typu przy deklaracji symbolem ^, na przykład deklaracja
var px:^Integer;
będzie traktowana jako deklaracja zmiennej wskaźnikowej do obiektu typu całkowitego.
Alokacja i zwalnianie pamięci dynamicznej
Przydział (alokacja) i zwalnianie (dealokacja) pamięci dynamicznej odbywa się za pomocą dwóch procedur: New(z) oraz Dispose(z). Obie te procedury mają jeden argument: zmienną. Wykonanie procedury New(z) powoduje następujące czynności
1. Określenie wielkości elementu alokowanego typu (wielkość ta musi być znana na etapie kompilacji programu) 2. Znalezienie adresu w pamięci, począwszy od którego jest dostępnych tyle kolejnych komórek, ile potrzeba na zaalokowanie żądanego elementu 3. Zarezerwowanie alokowanego obszaru 4. Przypisanie znalezionego adresu zmiennej z