Nur für den Schreck, ich habe beschlossen, eine Scheme binding to libpython zu erstellen, so dass Sie Python in Scheme-Programme einbetten können. Ich kann bereits in die C-API von Python einsteigen, habe aber nicht wirklich an Speicherverwaltung gedacht.Gibt es beim Umgang mit C-Code irgendwelche Python-Referenzzählungen/Garbage Collection?
Die Art und Weise mzscheme des FFI funktioniert, ist, dass ich eine Funktion aufrufen kann, und wenn die Funktion einen Zeiger auf eine PyObject
zurückgibt, dann kann ich es automatisch den Referenzzähler erhöht. Dann kann ich einen Finalizer registrieren, der die Referenzzählung dekrementiert, wenn das Scheme-Objekt Müll gesammelt wird. Ich habe mir die documentation for reference counting angeschaut und sehe auf den ersten Blick keine Probleme damit (obwohl es in manchen Fällen nicht optimal ist). Gibt es irgendwelche Fehler, die ich vermisse?
Auch habe ich Probleme, Kopf oder Zahl der . Welche Dinge muss ich hier beachten? Insbesondere, wie mache ich Python bewusst, dass ich einen Verweis auf etwas habe, so dass es es nicht sammelt, während ich es noch benutze?
Also ... Python verwendet Referenzzählung * und * ein Garbage Collector für zyklische Struktur? Das ist ein ziemlich großer Fehler. Die Design-Art. In jedem Fall hört sich das so an, als würde es für Jason viel mehr "Spaß" machen, wenn irgendwelche Werte, die an einem python-seitigen Zyklus beteiligt sind, einem Schema ausgesetzt sind. –
Gute Info. Solange ich alles INKRAFIERE, wenn ich es bekomme und DECREF alles, wenn ich damit fertig bin, sollte ich in Ordnung sein? Oder gibt es irgendwelche Probleme, denen ich begegnen könnte? –
@Jason, nur INCREF * geliehen * Referenzen. Einige Funktionen geben * neue * Referenzen zurück, die bereits INCREF sind. INCREF'ing sie würde zu einem Speicherverlust führen. –