Доброго времени суток! Написал вчера кое-какую утилиту, используя модуль PyJACK, и внезапно обнаружил странную утечку памяти, ну не заметить её сложно, потому что в лупе через полминуты вся память вместе со свопом — ёк. Проблема в том, что Python list, который возвращает модуль на сях остаётся в памяти, даже если какой-нибудь del вызвать. Прошу пояснить, это я чего-то не знаю/не понимаю, или это багофича, и как вообще с этим быть? Python 2.7, xubuntu 12.04.
Итак, вот минимальный пример проблемы.
cmodule.c#include <Python.h><br><br>
static PyObject *<br>
test(PyObject *self, PyObject *args)<br>
{<br>
static PyObject *list;<br>
list = PyList_New(0);<br>
PyList_Append(list, Py_BuildValue("s", "nya"));<br>
return list;<br>
}<br><br>
static PyMethodDef<br>
ModuleMethods[] = {<br>
{"test", test, METH_VARARGS, "Test for memoty leak."},<br>
{NULL, NULL, 0, NULL}<br>
};<br><br>
PyMODINIT_FUNC<br>
initcmodule(void)<br>
{<br>
(void) Py_InitModule("cmodule", ModuleMethods);<br>
}<br>
setup.pyfrom setuptools import setup, Extension<br>
setup(ext_modules=[Extension('cmodule', ['src/cmodule.c'], include_dirs=['src'])])<br>
И собственно запускают это:
memleak_test.pyimport cmodule<br>
while True: cmodule.test()<br>
И смотрю как память течёт водопадом.
Как мне видится — это GC Python-а почему-то недоедает, или мой код так написан, что не попадает в его график работы?