Я использую библиотеку C, которая имеет несколько проблем с памятью. Я определил, что иногда он слишком рано уменьшает счетчик ссылок, что приводит к segfaults, и удалось обойти это, сохранив список объектов, чтобы раздуть счетчик ссылок. С другой стороны, я также указал конкретные случаи, когда счетчик ссылок слишком высок. Есть ли способ обойти эти случаи, начиная с кода Python, целенаправленно уменьшая счетчик ссылок?Есть ли способ уменьшить количество ссылок на объект в Python вручную?
Я понимаю, что это хакерский и ни в коем случае не чистый код или что-то еще, но мне нужно как-то разобраться с библиотекой с ошибками C, и, похоже, это может быть проще, чем выяснить, где проблема в коде C (к счастью, это open-source), исправляя его, а затем перекомпилируя его на всех платформах, которые мне нужно поддерживать.
Вы, вероятно, хотите, чтобы посмотреть в 'weakref' (http://docs.python.org/2/library/weakref.html) модуля – Brien
@Brien : Хм ... не уверен, что 'weakref' в этом случае не помог. Сам код C не выполняет «Py_DECREF» - слабая ссылка только позволит мне не увеличивать счетчик ссылок больше, чем он есть. Хотя, я полагаю, я мог бы найти ссылку на объект, который у меня уже есть, и превратить его в weakref ... hmm ... – Claudiu
Вы можете попробовать использовать Python C API 'Py_DecRef' через ctypes. См. Https://github.com/matplotlib/matplotlib/commit/a798b16134d275b8cc8d947bead6f6543e019671 для примера, который работает вокруг утечки памяти в PySide. – cgohlke