178 Godzina 12
problem. Do jakiego obiektu odnosi się rKot po wykonaniu linii 31? Jak już mówiliśmy, referencja musi odnosić się do istniejącego obiektu. Jeśli jest inaczej (obiekt jest nuli) to program jest nieprawidłowo napisany.
178 Godzina 12
Istnieją trzy rozwiązania tego problemu. Pierwsze polega na zadeklarowaniu w linii 25 obiektu klasy ZwyklyKot i zwrócenie go z funkcji Funkcja () przez wartość. Drugie idzie dalej i polega na zadeklarowaniu w funkcji Funkcja () obiektu klasy ZwyklyKot na stercie i zwróceniu wskaźnika do tego obiektu. Funkcja wywołująca będzie wtedy miała możliwość skasowania wskaźnika.
Trzecie, najbardziej eleganckie, polega na zadeklarowaniu obiektu w funkcji wywołującej i przekazaniu go do funkcji Funkcja () przez referencje.
Kiedy wykonujesz operację rezerwacji pamięci na stercie, jako wynik otrzymujesz wskaźnik do zarezerwowanego obszaru (lub wartość nuli). Niezbędnym jest zapamiętanie takiego wskaźnika w celu późniejszego zwolnienia pamięci.
Podczas przekazywania takiego obszaru z jednej funkcji do drugiej zawsze któraś musi posiadać jego wskaźnik. Zazwyczaj wartości w obszarze są przekazywane przez referencje, a kasowaniem zarezerwowanego bloku najczęściej zajmuje się funkcja, w której go zarezerwowano.
Niebezpieczeństwo pojawia się wtedy, gdy jedna funkcja rezerwuje pamięć, a inna ją zwalnia. Niejednoznaczność „przynależności” wskaźnika może spowodować dwa problemy: pozostawienie w pamięci zarezerwowanego obszaru albo druga skrajność, próbę dwukrotnego zwolnienia zarezerwowanego bloku. Obie sytuacje mogą przysporzyć wiele problemów. Bezpiecznie jest umieszczać rezerwowanie i zwalnianie bloku w jednej funkcji.
Jeśli piszesz funkcję, która musi rezerwować pamięć i przekazywać ją z powrotem do funkcji wywołującej to postaraj się to zmienić. Niech funkcja wywołująca rezerwuje niezbędną pamięć i przekazuje ją do wywoływanej funkcji przez referencje. Ten dobry, programistyczny zwyczaj pozwala na przesunięcie zarządzania pamięcią poza program, do funkcji wywołującej, która jednocześnie będzie miała możliwość zwolnienia zarezerwowanego obszaru.
problem. Do jakiego obiektu odnosi się rKot po wykonaniu linii 31? Jak już mówiliśmy, referencja musi odnosić się do istniejącego obiektu. Jeśli jest inaczej (obiekt jest nuli) to program jest nieprawidłowo napisany.
, Z.
Istnieją trzy rozwiązania tego problemu. Pierwsze polega na zadeklarowaniu w linii 25 obiektu klasy ZwyklyKot i zwrócenie go z funkcji Funkcja() przez wartość. Drugie idzie dalej i polega na zadeklarowaniu w funkcji Funkcja () obiektu klasy ZwyklyKot na stercie i zwróceniu wskaźnika do tego obiektu. Funkcja wywołująca będzie wtedy miała możliwość skasowania wskaźnika.
Trzecie, najbardziej eleganckie, polega na zadeklarowaniu obiektu w funkcji wywołującej i przekazaniu go do funkcji Funkcja () przez referencje.
Kiedy wykonujesz operację rezerwacji pamięci na stercie, jako wynik otrzymujesz wskaźnik do zarezerwowanego obszaru (lub wartość nuli). Niezbędnym jest zapamiętanie takiego wskaźnika w celu późniejszego zwolnienia pamięci.
Podczas przekazywania takiego obszaru z jednej funkcji do drugiej zawsze któraś musi posiadać jego wskaźnik. Zazwyczaj wartości w obszarze są przekazywane przez referencje, a kasowaniem zarezerwowanego bloku najczęściej zajmuje się funkcja, w której go zarezerwowano.
Niebezpieczeństwo pojawia się wtedy, gdy jedna funkcja rezerwuje pamięć, a inna ją zwalnia. Niejednoznaczność „przynależności” wskaźnika może spowodować dwa problemy: pozostawienie w pamięci zarezerwowanego obszaru albo druga skrajność, próbę dwukrotnego zwolnienia zarezerwowanego bloku. Obie sytuacje mogą przysporzyć wiele problemów. Bezpiecznie jest umieszczać rezerwowanie i zwalnianie bloku w jednej funkcji.
Jeśli piszesz funkcję, która musi rezerwować pamięć i przekazywać ją z powrotem do funkcji wywołującej to postaraj się to zmienić. Niech funkcja wywołująca rezerwuje niezbędną pamięć i przekazuje ją do wywoływanej funkcji przez referencje. Ten dobry, programistyczny zwyczaj pozwala na przesunięcie zarządzania pamięcią poza program, do funkcji wywołującej, która jednocześnie będzie miała możliwość zwolnienia zarezerwowanego obszaru.