Я не могу заставить __dealloc__ вызываться при удалении объекта

У меня есть следующий класс C ++:

.ЧАС

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; } 

Я разоблачил его следующим образом с Cython:

 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 

Моя проблема в том, что я не могу понять, как получить деструктор, вызванный из Python. Следующее ничего не делает:

 a_set = PyLabSet() del a_set 

Я не могу найти подобные проблемы в Интернете. Кто-нибудь из вас имеет представление о том, что я прихожу сюда?

Я что-то пропустил в отношении управления подсчета ссылок, или …

большое спасибо

One Solution collect form web for “Я не могу заставить __dealloc__ вызываться при удалении объекта”

del a_set удаляет ссылку на объект (локальная переменная). В объекте C ++ есть еще одна ссылка. Это называется эталонным циклом. Цикл GC мог собрать это через некоторое время. Однако нет никакой гарантии, когда (или даже если ) это произойдет, поэтому вы не должны полагаться на это 1 . Например, ссылочные циклы, содержащие чистые объекты Python с специальным методом __del__ , документируются, чтобы вообще не быть освобожденными. Я не знаю, запускает ли Cython реализацию __dealloc__ такое поведение, но, как указывалось ранее, уничтожение в любом случае не является детерминированным. Если вы хотите освободить какой-либо ресурс (например, блок памяти, который не является объектом Python, файлом, соединением, блокировкой и т. Д.), Вы должны разоблачить явный способ сделать это вручную (см. Методы close различные объекты). Контекстные менеджеры могут упростить код клиента, делая это.

Отказ от ответственности: почти все это специфично для CPython.

1 Некоторые люди предпочитают думать о GC как абстракции, которая имитирует доступность бесконечной памяти, а не что-то, что уничтожает недостижимые объекты. При таком подходе становится совершенно очевидным, что разрушение не является детерминированным и даже не гарантировано.

  • 3d скользящее окно в Theano?
  • Никакой прирост скорости от Cython
  • Могу ли я создать статический массив C с Cython?
  • Комплексные числа в Китоне
  • Оптимизация NumPy с Cython
  • Обтекание функции LAPACKE с помощью Cython
  • Как выставить функцию, возвращающую объект C ++ на Python с помощью Cython?
  • Cython: Должен ли я использовать np.float_t вместо двойного для типизированных видов памяти
  • Python - лучший язык программирования в мире.