2013-07-18 5 views
1

Я использую библиотеку C, которая имеет несколько проблем с памятью. Я определил, что иногда он слишком рано уменьшает счетчик ссылок, что приводит к segfaults, и удалось обойти это, сохранив список объектов, чтобы раздуть счетчик ссылок. С другой стороны, я также указал конкретные случаи, когда счетчик ссылок слишком высок. Есть ли способ обойти эти случаи, начиная с кода Python, целенаправленно уменьшая счетчик ссылок?Есть ли способ уменьшить количество ссылок на объект в Python вручную?

Я понимаю, что это хакерский и ни в коем случае не чистый код или что-то еще, но мне нужно как-то разобраться с библиотекой с ошибками C, и, похоже, это может быть проще, чем выяснить, где проблема в коде C (к счастью, это open-source), исправляя его, а затем перекомпилируя его на всех платформах, которые мне нужно поддерживать.

+0

Вы, вероятно, хотите, чтобы посмотреть в 'weakref' (http://docs.python.org/2/library/weakref.html) модуля – Brien

+0

@Brien : Хм ... не уверен, что 'weakref' в этом случае не помог. Сам код C не выполняет «Py_DECREF» - слабая ссылка только позволит мне не увеличивать счетчик ссылок больше, чем он есть. Хотя, я полагаю, я мог бы найти ссылку на объект, который у меня уже есть, и превратить его в weakref ... hmm ... – Claudiu

+1

Вы можете попробовать использовать Python C API 'Py_DecRef' через ctypes. См. Https://github.com/matplotlib/matplotlib/commit/a798b16134d275b8cc8d947bead6f6543e019671 для примера, который работает вокруг утечки памяти в PySide. – cgohlke

ответ

6

Использование Py_DecRef через ctypes:

import ctypes 

_decref = ctypes.pythonapi.Py_DecRef 
_decref.argtypes = [ctypes.py_object] 
_decref.restype = None 

_decref(a_python_object) 
+0

только то, что я ищу - спасибо! Также оценили ссылку PySide, чтобы увидеть, как кто-то другой это сделал. – Claudiu