W językach typu C i C++programista jest odpowiedzialny za dynamiczną alokację i dealokację pamięci na stercie. W C dokonuje się tego poprzez wywołanie funkcji malloc() oraz free(). W C++ używa się operatorów new oraz delete, które w gruncie rzeczy służą do tego samego - w rzeczywistości są one zaimplementowane z wykorzystaniem malloc() i free(), więc nasz dalszy opis ograniczymy tylko do funkcjonalności języka C.
Każdy blok pamięci zaalokowany poprzez wywołanie malloc() powinien w końcu zostać zwrócony do puli dostępnej pamięci poprzez dokładnie jedno wywołanie funkcji free(). Ważnym jest, aby wywołać free() w odpowiednim momencie. Jeśli adres bloku został utracony bez wcześniejszego wywołania na nim free() pamięć będzie zajęta aż do momentu zakończenia pracy przez program. Taka sytuacja nazywana jest wyciekiem pamięci (memory leak). Z drugiej strony, jesli program wywołał free() na bloku pamięci a następnie nadal z niego korzysta powstaje konflikt z ponownym wykorzystaniem bloku przez kolejne wywołanie malloc(). Taką sytuację nazywamy użyciem zwolnionej pamięci. Konsekwencje takiego błędu są identyczne w wykorzystywaniem niezainicjowanych danych -- zrzucanie pliku core, błędne wyniki, niewyjaśnione pady programu.
Częsta przyczyną wycieków pamięci są nietypowe przejścia przez kod. Na przykład funkcja może alokować blok pamięci, dokonywać obliczeń a następnie zwalniać ten blok. Następnie zmiana w funkcji może dodawać sprawdzenie błędu w trakcie obliczeń co powoduje wcześniejszy powrót z funkcji. Łatwo jest zapomnieć o zwolnieniu zaalokowanej pamięci w przypadku takiego wczesnego powrotu z funkcji, szczególnie, gdy zmiana wprowadzana jest do funkcji długo po tym, gdy została napisana oryginalna funkcja. Takie wycieki często są niezauważone przez długi okres, ponieważ wyjścia z funkcji spowodowane przez sytuację błędu stanowią niewielki odsetek wywołań funkcji a większość nowoczesnych komputerów posiada dużo pamięci wirtualnej, więc wyciek stałby się wyraźnie widocznym dopiero w przypadku procesów działających przez długi czas często wywołujących funkcję powodującą wyciek pamięci. Dlatego ważne jest, aby zminimalizować możliwość występowania wycieków pamięci poprzez przyjęcie konwencji lub strategii kodowania, które minimalizują możliwość występowania takich błędów.
Z uwagi na fakt, iż Python intensywnie wykorzystuje funkcje malloc() oraz free() niezbędna jest strategia unikania wycieków pamięci jak również używania zwolnionej pamięci. Wybrana metoda zwana jest licznikiem odwołań. Założenie jest proste: każdy obiekt posiada licznik, który jest zwiększany za każdym razem, gdy gdziekolwiek jest zachowywane odwołanie do obiektu. Licznik, jest zmniejszany, gdy odwołanie do obiektu jest usuwane. Gdy licznik osiągnie wartość zero oznacza to, że ostatnie odwołanie do obiektu zostało usunięte i obiekt zostaje zwolniony.
Alternatywne podejście nazywane jest automatycznym odśmiecaniem (czasem stosowanie licznika odwołań nazywane jest również odśmiecaniem, dlatego używamy określenia "automatyczny" dla odróżnienia tych dwóch rozwiązań). Wielką zaletą automatycznego odśmiecania jest to, że użytkownik nie musi jawnie wywoływać free() (inną głoszoną zaletą jest zwiększenie szybkości uzyskiwania dostępu do pamięci, lecz nie jest to faktem udowodnionym). Wadą jest to, że dla języka C nie stworzono żadnej naprawdę przenośnej implementacji automatycznego odśmiecania, podczas gdy liczniki odwołań mogą zostać zaimplementowane w sposób przenośny (pod warunkiem, że dostępne są funkcje malloc() oraz free() co jest zagwarantowane przez standard C). Być może pewnego dnia automatyczne odśmiecanie zostanie zaimplementowane dla języka C w sposób dostatecznie przenośny. Do tego czasu musimy sobie radzić z licznikami odwołań.
Pomimo wykorzystania w Pythonie tradycyjnej techniki licznika odwołań, dostępny jest również mechanizm wykrywania odwołań cyklicznych. Pozwala on na tworzenie bezpośrednich lub pośrednich odwołąń cyklicznych bez obawy o wpędzenie się w kłopoty. ODwołania cykliczne są słabością technik odśmiecania opartych o liczniki odwołań. Odwołania cykliczne występują wtedy, gdy obiekt zawiera odwołania do samego siebie (niekoniecznie bezpośrednie), co powoduje, że każdy obiekt w takim cyklu posiada niezerowy licznik odwołań. Klasyczny mechanizm liczników odwołań nie jest w stanie zwolnić pamięci zajmowanej przez obiekty z takiego cyklu, nawet, gdy nigdzie w programie nie istnieją odwołania do samego cyklu.
Mechanizm wykrywający takie cykle jest w stanie zwolnić pamięć przez nie
zajmowaną, o ile w kodzie nie są wykorzystywane metody finalizujące
(__del__()). Gdy jednak kod wykorzystuje te metody, do takich
cykli odwołań możemy uzyskać dostęp za pomocą modułu
gc../lib/module-gc.htmla dokładniej w zmiennej
garbage tego modułu). Moduł gc udostępnia również
możliwość wymuszenia działania wykrywacza (funkcja
collect()). Dostępne są również interfejsy konfiguracyjne jak
również możliwość wyłączenia wykrywacza cykli w naszym programie.
Wykrywacz cykli jest mechanizmem opcjonalnym. Pomimo, że jest domyślnie
uaktywniony, możemy całkowicie wyłączyć go podczas kompilacji Pythona,
wykorzystując opcję --without-cycle-gc skryptu
configure (dotyczy to systemów klasy Unix wliczając w to
system Mac OS X), lub usuwając definicję WITH_CYCLE_GC w pliku
pyconfig.h (na pozostałych platformach). Jeśli w ten sposób
wyłączymy wykrywacz cykli, moduł gc nie będzie dostępny.