Pamięć dynamiczna: Różnice pomiędzy wersjami
Linia 21: | Linia 21: | ||
1. Odblokowanie zarezerwowanego obszaru pamięci i zwrócenie go do puli niewykorzystanych obszarów. | 1. Odblokowanie zarezerwowanego obszaru pamięci i zwrócenie go do puli niewykorzystanych obszarów. | ||
Przyjmijmy, że po wykonaniu <tt>Dispose(z)</tt> wartość zmiennej <tt>z</tt> jest nieokreślona. | Przyjmijmy, że po wykonaniu <tt>Dispose(z)</tt> wartość zmiennej <tt>z</tt> jest nieokreślona. W rzeczywistości często komplatory po zwolnieniu zaalokowanego obszaru pozostawiają starą wartość adresu na zmiennej, której dealokacja dotyczyła. Bardzo niebezpieczne jest używanie tej wartośći do czegokolwiek i nie należy nigdy tego robić. | ||
Zatem zmienne dynamiczne operują w rzeczywistości na adresach. W konsekwencji pamięć rezerwowana na zmienną dynamiczną jest taka sama (zazwyczaj 4 bajty) i niezależna od tego, na co ta zmienna wskazuje. | Zatem zmienne dynamiczne operują w rzeczywistości na adresach. W konsekwencji pamięć rezerwowana na zmienną dynamiczną jest taka sama (zazwyczaj 4 bajty) i niezależna od tego, na co ta zmienna wskazuje. | ||
===Operacje na zmiennych dynamicznych=== | ===Operacje na zmiennych dynamicznych=== | ||
Zmienne dynamiczne mają ograniczone możliwości wykonywania na nich działań. Możliwe jest porównanie ich wartości, ale tylko pod kątem równości, czyli z operatorów relacyjnych mamy jedynie dwa: <tt>=</tt> oraz <tt><></tt>. | Zmienne dynamiczne mają ograniczone możliwości wykonywania na nich działań. Możliwe jest porównanie ich wartości, ale tylko pod kątem równości, czyli z operatorów relacyjnych mamy jedynie dwa: <tt>=</tt> oraz <tt><></tt>. |
Wersja z 13:17, 30 wrz 2006
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
Jeśli nie ma spójnego fragmentu pamięci, w którym można by zaalokować żądany element, to procedura New(z) powoduje błąd.
Procedura Dispose(z) powoduje tylko jedną rzecz
1. Odblokowanie zarezerwowanego obszaru pamięci i zwrócenie go do puli niewykorzystanych obszarów.
Przyjmijmy, że po wykonaniu Dispose(z) wartość zmiennej z jest nieokreślona. W rzeczywistości często komplatory po zwolnieniu zaalokowanego obszaru pozostawiają starą wartość adresu na zmiennej, której dealokacja dotyczyła. Bardzo niebezpieczne jest używanie tej wartośći do czegokolwiek i nie należy nigdy tego robić.
Zatem zmienne dynamiczne operują w rzeczywistości na adresach. W konsekwencji pamięć rezerwowana na zmienną dynamiczną jest taka sama (zazwyczaj 4 bajty) i niezależna od tego, na co ta zmienna wskazuje.
Operacje na zmiennych dynamicznych
Zmienne dynamiczne mają ograniczone możliwości wykonywania na nich działań. Możliwe jest porównanie ich wartości, ale tylko pod kątem równości, czyli z operatorów relacyjnych mamy jedynie dwa: = oraz <>.