У меня есть следующий код в cython в файле pyx, который преобразует wchar_t * в строку python (юникод)
// Весь код ниже — это Python 2.7.4
cdef wc_to_pystr(wchar_t *buf):
if buf == NULL:
return None
cdef size_t buflen
buflen = wcslen(buf)
cdef PyObject *p = PyUnicode_FromWideChar(buf, buflen)
return <unicode>p
Я вызвал эту функцию в цикле следующим образом:
cdef wchar_t* buf = <wchar_t*>calloc(100, sizeof(wchar_t))
# ... copy some wide string to buf
for n in range(30000):
u = wc_to_pystr(buf) #<== behaves as if its a memory leak
free(buf)
Я проверил это в Windows, и заметил, что память (как видно из диспетчера задач) продолжает увеличиваться, и поэтому я подозреваю, что здесь может быть утечка памяти.
Это удивительно, потому что:
- Насколько я понимаю, API PyUnicode_FromWideChar() копирует предоставленный буфер.
- Каждый раз, когда переменной 'u' присваивается другое значение, предыдущее значение должно быть освобождено.
- Поскольку исходный буфер ('buf') остается как есть и освобождается только после завершения цикла, я ожидал, что память после определенного момента вообще не должна увеличиваться.
Есть идеи, где я ошибаюсь? Есть ли лучший способ реализовать Wide Char для объекта unicode python?
del u
в цикл for и снова проверить, продолжает ли увеличиваться память? - person gg349   schedule 07.12.2014