Tylko dla czystej cholery, zdecydowałem się stworzyć Scheme binding to libpython, dzięki czemu można osadzać Python w programach Scheme. Mogę już zadzwonić do C API Pythona, ale tak naprawdę nie myślałem o zarządzaniu pamięcią.Czy są jakieś potencjometry odwołujące się do Pythona/wątki zbierania śmieci podczas pracy z kodem C?
Sposób działania funkcji FFI mzscheme polega na tym, że mogę wywołać funkcję, a jeśli funkcja zwróci wskaźnik do PyObject
, mogę automatycznie zwiększyć wartość referencyjną. Następnie mogę zarejestrować finalizator, który zmniejszy licznik odwołań, gdy obiekt Scheme zbierze śmieci. Spojrzałem na documentation for reference counting i na pierwszy rzut oka nie widzę żadnych problemów (chociaż w niektórych przypadkach może to być nieoptymalne). Czy są jakieś zagubienia, których mi brakuje?
Mam także problemy z głowicami i ogonami cyclic garbage collector documentation. O jakich rzeczach muszę tutaj pamiętać? W szczególności, w jaki sposób mogę uczynić Pythona świadomym, że mam odnośnik do czegoś, więc nie zbiera go, kiedy wciąż go używam?
Więc ... Python używa licznika odwołań * i * śmieciarki do cyklicznej struktury? To dość poważna wada. Rodzaj projektu. W każdym razie wygląda na to, że sprawi to, że Jason będzie o wiele bardziej "zabawny", jeśli jakiekolwiek wartości biorące udział w cyklu po stronie Pythona są narażone na schemat. –
Dobre informacje. Tak długo, jak INCREF wszystko, kiedy to otrzymam i DECREF wszystko, gdy skończę, powinienem być OK? Czy są jakieś problemy, na które mogę się natknąć? –
@Jason, tylko INCREF * wypożyczone * referencje. Niektóre funkcje zwracają * nowe * referencje, które są już WKRÓTCE. PODWYŻSZENIE ich spowodowałoby wyciek pamięci. –