Co to jest słabe odniesienie?

Słabe odwołanie to odwołanie do obiektu w pamięci, które nie zapobiega czyszczeniu obiektu przez procedury wyrzucania elementów bezużytecznych ze względu na jego skojarzenie z obiektem. Ten typ odwołania jest powszechnie używany w celu wyeliminowania wycieków pamięci, gdy istnieją specjalne warunki, które uniemożliwiają normalne wyrzucanie elementów bezużytecznych. Algorytmy programowania, które używają odwołań cyklicznych lub przechowują nieistotne informacje w pamięci podręcznej lub specjalnej strukturze, korzystają ze słabych odwołań. Wykorzystanie słabych referencji w tego typu sytuacjach pozwala na oczyszczenie nieużywanych obiektów referencyjnych i związanych z nimi słabych referencji.

W programowaniu komputerowym silne odniesienie jest zwykle tworzone domyślnie podczas tworzenia obiektu, a pamięć zajmowana przez obiekt pozostaje przydzielona tak długo, jak silne odniesienie pozostaje wykonalne. Silne odwołanie zostaje unieważnione, a skojarzona z nim pamięć obiektu zostaje zwolniona wkrótce po tym, jak silne odwołanie i jego obiekt zostaną oznaczone jako nieużywane przez program. W pewnych sytuacjach, takich jak programowanie gniazd lub aplikacje do manipulacji obrazami, klasy używane do tworzenia obiektów roboczych nie mają wbudowanej zdolności do przechowywania dodatkowych informacji wymaganych przez konkretną aplikację. Dodatkowe szczegóły dotyczące obiektów przejściowych, takich jak połączenia lub obrazy, muszą być przechowywane w dodatkowych obiektach pamięci podręcznej i połączone z obiektami przejściowymi przez odwołania. Kiedy słaba referencja jest używana zamiast silnej referencji, dodatkowe informacje nie są wiązane przez referencję i mogą zostać usunięte z pamięci podręcznej przez garbage collector, gdy obiekt referent zostanie oznaczony jako nierealny.

Słabe klasy referencyjne są zwykle dostępne w językach, które są wspomagane przez podsystemy wyrzucania elementów bezużytecznych, w tym Java, Python, Perl, C# i platformę .NET. Jednak w C++ programiści są zazwyczaj odpowiedzialni za czyszczenie pamięci. W tym języku zaimplementowano klasę inteligentnego wskaźnika, która zapewnia niektóre z tych samych funkcji, które zapewniają słabe referencje i wyrzucanie elementów bezużytecznych, pomagając zmniejszyć wycieki pamięci spowodowane niewłaściwym czyszczeniem wskaźnika.

Aby jeszcze bardziej ułatwić zarządzanie pamięcią, języki z funkcjami odśmiecania pamięci mogą dodatkowo ulepszyć funkcjonalność języka, zapewniając dokładniejsze gradienty odniesień innych niż silne lub słabe odniesienie. Typy danych, takie jak miękkie odwołania i odwołania fantomowe, mogą być zawarte w tych językach, co pozwala na różne poziomy przechwycenia obiektu lub powiadomienia o cofnięciu alokacji. Programiści używający języków z automatycznym wyrzucaniem elementów bezużytecznych powinni zapoznać się ze wszystkimi dostępnymi klasami referencyjnymi w celu poprawy wydajności aplikacji.