Я считаю, что проблема здесь была одной из ссылок подсчета.
PyType_Ready() заполняет различные поля tp_ * в зависимости от базиса вашего типа.
Один из них - tp_alloc, который я установил в 0. В его документе указано, что для refcount установлено значение 1, а блок памяти обнулен.
Каждый экземпляр Python создает этот тип, новый PyObject добавляется в соответствующий словарь Python. Если это переменная уровня модуля, это словарь модуля.
Когда словарь разрушен, он содержит объекты DECREF-s. Теперь refcount будет 0, и tp_dealloc будет запущен.
Похоже, что в моем коде я где-то выполнял дополнительный INCREF, и объект никогда не собирался собирать мусор.
Кажется, что (если вы не компилируете с определенным флагом) Python не имеет связанного списка, который позволил бы отслеживать все его объекты. Поэтому мы не можем предположить, что Py_Finalize() очистится. Это не будет!
Вместо этого каждый объект хранится в словаре для его сдерживающей области и т. Д. Обратно в словарь модуля. Когда этот модуль словарь уничтожен, разрушение будет ползти наружу через все ветви.
Имел ту же проблему и нашел, что используя: sys.getrefcount (object) – alex