2015-02-01 8 views
1

Я внедряю Python в C++.tp_dealloc не получает удар после выхода

У меня есть рабочий объект расширения C++ Python.

Единственное, что неправильно, это то, что если я установил tp_dealloc в пользовательскую функцию, он никогда не будет вызван.

Я бы подумал, что Py_Finalize() может вызвать это, или, возможно, завершение программы. Но нет.

Может ли кто-нибудь предложить, почему tp_dealloc не попадает?

ответ

1

Я считаю, что проблема здесь была одной из ссылок подсчета.

PyType_Ready() заполняет различные поля tp_ * в зависимости от базиса вашего типа.

Один из них - tp_alloc, который я установил в 0. В его документе указано, что для refcount установлено значение 1, а блок памяти обнулен.

Каждый экземпляр Python создает этот тип, новый PyObject добавляется в соответствующий словарь Python. Если это переменная уровня модуля, это словарь модуля.

Когда словарь разрушен, он содержит объекты DECREF-s. Теперь refcount будет 0, и tp_dealloc будет запущен.

Похоже, что в моем коде я где-то выполнял дополнительный INCREF, и объект никогда не собирался собирать мусор.

Кажется, что (если вы не компилируете с определенным флагом) Python не имеет связанного списка, который позволил бы отслеживать все его объекты. Поэтому мы не можем предположить, что Py_Finalize() очистится. Это не будет!

Вместо этого каждый объект хранится в словаре для его сдерживающей области и т. Д. Обратно в словарь модуля. Когда этот модуль словарь уничтожен, разрушение будет ползти наружу через все ветви.

+1

Имел ту же проблему и нашел, что используя: sys.getrefcount (object) – alex

 Смежные вопросы

  • Нет связанных вопросов^_^