我已經在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