gpt4 book ai didi

python - 将宽字符转换为 python 字符串时可能发生内存泄漏

转载 作者:行者123 更新时间:2023-11-28 16:35:06 25 4
gpt4 key购买 nike

我在 pyx 文件中的 cython 中有以下代码,它将 wchar_t* 转换为 python 字符串(unicode)

//下面所有代码都是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 上对此进行了测试,观察到内存(如任务管理器中所见)不断增加,因此我怀疑此处可能存在内存泄漏。

这是令人惊讶的,因为:

  1. 根据我的理解,API PyUnicode_FromWideChar() 复制了提供的缓冲区。
  2. 每次变量'u'被赋予一个不同的值,之前的值应该被释放
  3. 由于源缓冲区('buf')保持原样并且仅在循环后释放结束,我原以为在某个点之后内 stub 本不应该增加

知道我哪里出错了吗?有没有更好的方法将 Wide Char 实现为 python unicode 对象?

最佳答案


已解决!!解决方案:

(注意:解决方案指的是我的一段代码,最初不在问题中。我在发布时不知道它将掌握解决这个问题的关键。对不起那些想到解决的人。 ..)

在 cython pyx 文件中,我声明了 python API,如下所示:

PyObject* PyUnicode_FromWideChar(const wchar_t *w, Py_ssize_t size)

我在 https://github.com/cython/cython/blob/master/Cython/Includes/cpython/init.pxd 查看了文档

我已将返回类型声明为 PyObject*,因此创建了一个额外的引用,我没有明确取消引用。解决方案是更改签名中的返回类型,例如:

object PyUnicode_FromWideChar(const wchar_t *w, Py_ssize_t size)

根据文档,添加“object”作为返回类型不会增加任何引用计数,因此在 for 循环中内存被正确释放。修改后的“wc_to_pystr”如下所示:

cdef wc_to_pystr(wchar_t *buf):
if buf == NULL:
return None
cdef size_t buflen
buflen = wcslen(buf)
p = PyUnicode_FromWideChar(buf, buflen)
return p

关于python - 将宽字符转换为 python 字符串时可能发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27345237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com