我已经在PYX文件,用Cython下面的代码,其为wchar_t *转换为Python字符串(Unicode)的潜在内存泄漏
//下面的所有代码是蟒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和观察是内存(如被看见在任务管理器)不断增加和h因为我怀疑这里可能会有内存泄漏。
- 按我的理解API PyUnicode_FromWideChar()复制 提供的缓冲区:
这是因为是令人惊讶的。
- 每个时间变量“U”被分配一个不同的值,先前的值 应当释放出的
- 由于源缓冲器(“BUF”)仍保持原样,只在循环之后被释放 端,我期待内存不应该增加一定的点后
任何想法,我哪里错了?有没有更好的方法来实现宽字符到python unicode对象?
你可以尝试在for循环中添加一个'del u'并检查内存是否继续增加? – gg349 2014-12-07 17:49:14
@GiulioGhirardo,我试着按照你的说法,仍然记忆力不断增加。在这一点上,我不确定它是真正的内存泄漏还是python GC有点懒惰收集垃圾 – user2248790 2014-12-08 02:41:23