Утечка памяти расширения Python C

Я написал некоторое расширение C для своих программ на python, и я только что заметил, что есть проблема с утечкой памяти, однако сама программа на C не пропускает память, поэтому я предполагаю, что есть проблема с подсчетом ссылок. В настоящее время, когда я использую консоль python для запуска своей программы, после завершения вычислений общая память python3 действительно велика, что указывает на то, что некоторые объекты не выпущены, могу ли я узнать, какие объекты есть или когда объекты выделены?

Расширение C является частью большого пакета, поэтому вставить сюда весь пакет невозможно.


person 1a1a11a    schedule 27.08.2016    source источник
comment
getrefcount() может помочь, если вы знаете, какие объекты подозреваются в утечке docs.python. org/2/library/sys.html#sys.getrefcount   -  person slezica    schedule 28.08.2016
comment
Спасибо за помощь! какое количество ссылок я должен ожидать для объекта в конце вычислений? 1? (у меня получается 2). На самом деле у меня есть класс A, использующий расширение C для выполнения некоторых вычислений и сохранения в нем результатов (для возможных следующих вычислений), и у меня есть метод очистки в методе del для очистки в классе A. .Похоже деструктор не вызывается до конца скрипта, почему? Даже если я del object, он все равно не вызывается. @slezica   -  person 1a1a11a    schedule 28.08.2016
comment
2 это минимум. Одну ссылку вы используете для вызова getrefcount, другая ссылка принадлежит getrefcount. В оболочке Python x = {}; sys.getrefcount(x) дает 2. Это означает, что вызывающая сторона getrefcount владеет единственной ссылкой. Если вы потеряете его, он должен быть собран в мусор. Вы теряете его? Вы уверены, что C не протекает? Я бы попробовал valgrind. Так же __del__ не очень надежен в cpython, хотя специфики не помню   -  person slezica    schedule 28.08.2016
comment
@slezica вы очень помогаете, спасибо! Я не использовал valgrind вместо python, файл подавления, похоже, не работает для python3. Я использовал valgrind в самой программе C (без передачи ссылки на python3), проблемы с утечкой памяти нет. Я только что понял, что даже если я вызову объект del, gc.collect(), del все равно не будет вызываться, кажется, даже если на объект больше не ссылаются, он все равно не будет собранный мусор.   -  person 1a1a11a    schedule 28.08.2016
comment
Циклические ссылки могут вызвать утечку памяти, старый вопрос < href="https://docs.python.org/3.5/c-api/gcsupport.html" rel="nofollow noreferrer">документ cpython   -  person J.J. Hakala    schedule 28.08.2016
comment
спасибо за указание, я проверил, у меня нет циклической ссылки @J.J.Hakala   -  person 1a1a11a    schedule 28.08.2016