Ich kann beim Öffnen eines Objekts nicht __dealloc__ aufgerufen werden

Ich habe die folgende C ++ – Klasse:

.H

class ALabSet: public LabSet { public: PyObject *m_obj; ALabSet(PyObject *obj); virtual ~ALabSet(); PyObject *GetPyObj(); }; 

.CPP

 ALabSet::ALabSet(PyObject *obj): LabSet() { this->m_obj = obj; // Provided by "cyelp_api.h" if (import_cyelp()) { } else { Py_XINCREF(this->m_obj); } } ALabSet::~ALabSet() { Py_XDECREF(this->m_obj); } PyObject *ALabSet::GetPyObj() { return this->m_obj; } 

Ich habe es wie folgt mit Cython ausgesetzt:

 cdef extern from "adapter/ALabSiteSetsManager.h" namespace "elps" : cdef cppclass ALabSet: ALabSet(PyObject *) PyObject *GetPyObj() cdef class PyLabSet: cdef ALabSet *thisptr def __cinit__(self): self.thisptr = new ALabSet(<PyObject *>self) def __dealloc__(self): print "delete from PY !" if self.thisptr: del self.thisptr 

Mein Problem ist, dass ich nicht herausfinden kann, wie man den Destruktor von Python ruft. Das Folgende tut genau nichts:

 a_set = PyLabSet() del a_set 

Ich kann keine ähnlichen Ausgaben im Web finden. Hat irgendjemand von Ihnen eine Vorstellung von mir hier?

Ich vermisse etwas über Referenzzähler-Management oder …

Danke vielmals

One Solution collect form web for “Ich kann beim Öffnen eines Objekts nicht __dealloc__ aufgerufen werden”

del a_set entfernt einen Verweis auf das Objekt (die lokale Variable). Im C ++ – Objekt gibt es noch einen weiteren Hinweis. Dies ist als Referenzzyklus bekannt. Der Zyklus GC konnte dies nach einer Weile sammeln. Allerdings gibt es keine Garantie, wenn (oder auch wenn ) dies geschieht, also solltest du dich nicht darauf verlassen 1 . Zum Beispiel werden Referenzzyklen, die reine __del__ mit einer __del__ Spezialmethode enthalten, dokumentiert, um überhaupt nicht befreit zu werden . Ich weiß nicht, ob __dealloc__ Implementierung von __dealloc__ dieses Verhalten auslöst, aber wie bereits erwähnt, ist die Zerstörung sowieso nicht deterministisch. Wenn du eine Ressource befreien möchtest (zB einen Speicherblock, der kein Pythonobjekt ist, eine Datei, eine Verbindung, eine Sperre usw.) solltest du eine explizite Art und Weise manuell aussetzen (vgl. Die close Methoden von Verschiedene Objekte). Kontextmanager können damit den Client-Code vereinfachen.

Haftungsausschluss: Fast das alles ist CPython-spezifisch.

1 Manche Leute bevorzugen es, an GC als Abstraktion zu denken, die die Verfügbarkeit unendlicher Erinnerungen simuliert, anstatt etwas, das unerreichbare Objekte zerstört. Mit diesem Ansatz wird es ganz klar, dass die Zerstörung nicht deterministisch und gar nicht garantiert ist.

Python ist die beste Programmiersprache der Welt.