2016-03-31 11 views
0

lesen in Python CFFI documentation:Müssen Sie die Zerstörung der letzten Referenz auf eine Variable auslösen, die mit ffi.gc() aus Python-CFFI erstellt wurde?

Die Schnittstelle auf luajit des FFI basiert (...)

mehr lesen LuaJIT website (etwa ffi.gc()):

Diese Funktion ermöglicht die sichere Einbindung von nicht verwaltete Ressourcen in die automatische Speicherverwaltung des LuaJIT Garbage Collectors. Typische Anwendungen:

local p = ffi.gc(ffi.C.malloc(n), ffi.C.free) 
... 
p = nil -- Last reference to p is gone. 
-- GC will eventually run finalizer: ffi.C.free(p) 

Also, mit Python-CFFI, haben Sie die Zerstörung der letzten Verweis auf eine Variable ausgelöst haben instanziiert ffi.gc (= verwenden, die eine spezielle Funktion zur Aufhebung der Zuordnung braucht, weil einige Teile davon dynamisch zugewiesen werden), indem Sie es auf (zB) ffi.NULL setzen?

+0

Erledigt "Im Gegensatz zu C hat das zurückgegebene Zeigerobjekt Eigentum an dem zugewiesenen Speicher: Wenn dieses genaue Objekt als Garbage-Collected erfasst wird, wird der Speicher freigegeben." beantworte deine Frage? Von http://cffi.readthedocs.org/en/latest/using.html –

+0

Ihr Zitat funktioniert nur für Objekte auf dem Stapel zugeordnet, mit ffi.new (und ffi.cast?), Oder? – DRz

+0

Keine Ahnung. Aber es sieht so aus, als ob es gleich funktioniert (von derselben Seite: "ffi.gc (cdata, destructor): gibt ein neues cdata-Objekt zurück, das auf dieselben Daten zeigt. Später, wenn dieses neue cdata-Objekt garbage-collected ist, destruktor (old_cdata_object) wird aufgerufen. Beispiel für die Verwendung: ptr = ffi.gc (lib.malloc (42), lib.free) Beachten Sie, dass die zurückgegebenen Zeigerobjekte, wie von ffi.new() zurückgegebene Objekte, Eigentümerschaft sind, was bedeutet, dass Der Destruktor wird aufgerufen, sobald dieses genau zurückgegebene Objekt von einem Müll gesammelt wurde. –

Antwort

1

Python ist so entworfen, dass alle Objekte Müll gesammelt werden, sobald es keinen Verweis mehr darauf gibt (oder bald danach), wie jede andere Müll-gesammelte Sprache (einschließlich Lua). Der Trick, p = None explizit (oder del p) zu setzen, stellt lediglich sicher, dass diese lokale Variable p das Objekt nicht am Leben erhält. Es ist sinnlos (abgesehen von Sonderfällen), wenn es zum Beispiel eines der letzten Dinge in dieser Funktion ist. Sie brauchen es nicht mehr, als Sie es benötigen, um zB eine Variable freizugeben, die ein normales String-Objekt enthalten würde.