1.10.1 Liczniki odwołań w Pythonie

Istnieją dwa makra: Py_INCREF(x) oraz Py_DECREF(x) które służą do obsługi zwiększania i zmniejszania liczników odwołań. Py_DECREF(x) również zajmuje się zwalnianiem bloku pamięci gdy licznik osiągnie wartość zero. Dla elastyczności nie wywołuje wprost funkcji free(), lecz wywołuje funkcję wskazywaną przez wskaźnik w obiekcie typu zwalnianego obiektu. Dla tego celu (ale nie tylko) każdy obiekt zawiera wskaźnik do swojego obiektu typu.

Pozostaje ważne pytanie: kiedy używać Py_INCREF(x) oraz Py_DECREF(x)? Wprowadźmy najpierw pewne terminy. Nie można "posiadać" obiektu, można jednak posiadać odwołanie do obiektu. Licznik odwołań obiektu jest zdefiniowanyjako liczba posiadanych odwołań do niego. Właściciel odwołania jest zobowiązany do wywołania Py_DECREF() gdy odwołanie nie jest już potrzebne. Własność odwołania może być przekazana. Istnieją trzy sposoby pozbycia się odwołania: przekazanie, przechowanie oraz wywołanie Py_DECREF(). Zapomnienie pozbycia się posiadanego odwołania powoduje wyciek pamięci.

Możliwe jest również "pożyczenie"1.2 odwołania do obiektu. Procedura pożyczająca odwołanie nie musi wywoływać Py_DECREF(). Pożyczone odwołanie nie może być w użyciu procedury pożyczającej dłużej niż w posiadaniu przez właściciela. Użycie pożyczonego odwołania po tym, jak właściciel się go pozbędzie wprowadza niebezpieczeństwo użycia zwolnionej pamięci i powinno być absolutnie unikane.1.3

Zaleta pożyczania nad posiadaniem odwołania polega na tym, że nie ma potrzeby pozbywania się odwołania na różnych ścieżkach przejść kodu -- innymi słowy w przypadku pożyczania referencji nie ma ryzyka wystąpienia wycieku pamięci w przypadku przedwczesnego wyjścia z procedury. Wadą pożyczania w stosunku do posiadania odwołania jest możliwość wystąpienia sytuacji w pozornie poprawnym kodzie, gdy używamy odwołania po tym, gdy właściciel, od którego zostało pożyczone już się go pozbył.

Pożyczone odwołanie może zostać zmienione we własne poprzez wywołanie Py_INCREF(). Nie zmienia to stanu własności procedury od której pożyczono odwołanie -- tworzone jest po prostu nowe odwołanie i narzuca pełne obowiązki właściciela (nowy właściciel musi pozbyć się odwołania we właściwy sposób, podobnie jak poprzedni właściciel).



...pożyczenie1.2
ta przenośnia nie jest do końca adekwatna: właściciel "pożyczonego" odwołania nadal posiada jego kopię.
... unikane.1.3
Sprawdzenie, czy licznik odwołań jest równy co najmniej 1 nie będzie działać -- licznik odwołań również znajduje się w zwolnionej pamięci i może być już używany przez inny obiekt!
Zajrzyj do Informacji na temat tej publikacji... aby pomóc w jej rozwoju.