alokowany jest obiekt typu X alokowany jest obiekt typu Y jeśli podczas tej alokacji system zdecyduje się przeprowadzić „”, obiekt typu X zostanie zwolniony, ponieważ nie ma do niego żadnych odwołań wywoływane jest foo. Jeśli X zostało zwolnione, może nastąpić naruszenie ochrony pamięci lub inny poważny i trudny do wykrycia lub usunięcia błąd.
Istnieje kilka metod radzenia sobie z tym problemem, m.in. dodanie stosu (na którym znajduje się odnośnik do obiektu typu X) do zbioru początkowego.
Problem jest poważniejszy, jeśli pisane są rozszerzenia do języka z mechanizmem w innym języku, np. w C:
{ LangObject x, y, z; x = lang_create_X(parametry); y = lang_create_Y(parametry); z = foo(x, y); return z; }
W tym przypadku język ten zdecydowanie „nie wie”, że do x są odwołania. Dość powszechną metodą jest dodawanie stosu systemowego (używanego przez C) do zbioru początkowego (oczywiście nie wszystko na nim jest odwołaniem do jednostki pamięci). Jednak nie ma gwarancji, że ten odnośnik w ogóle będzie znajdował się na stosie – kompilator mógł postanowić trzymać go np. w rejestrze.
Zobacz też alokacja pamięci wyciek pamięci
Przypisy
Kategoria:Zarządzanie pamięcią