小编Uru*_*ann的帖子

Cython:返回一个 <object>PyObject*,它会泄漏吗?

我目前正在使用 Cython 包装一个库。为此,我想重用纯 C 绑定的一个函数。

这是基本设置:

  • mylib.pxd
  • 旧库.c
  • 旧的_lib.h

在 mylib.pxd 中我这样做:

cdef extern from old_lib.h:
    PyObject* get_pyobject()
Run Code Online (Sandbox Code Playgroud)

然后old_lib.c作为源文件传递到我的扩展中:

setup(ext_modules=[Extension("mylib", sources=["mylib.pxd", "old_lib.c"])])
Run Code Online (Sandbox Code Playgroud)

在 mylib.pxd 中,我使用get_pyobject它创建一个我想要返回的新对象,如下所示:

cdef PyObject* ptr
ptr = get_pyobject()
return <object>ptr
Run Code Online (Sandbox Code Playgroud)

这给了我想要的行为,但我担心这会泄漏 ptr 引用。

会吗?我很困惑,因为我发现(旧)引用说你应该自己管理 PyObject* 引用并相应地调用 Py_INCREF/DECREF 但似乎在 Cython FAQ中他们说:

请注意,对象的生命周期仅绑定到其拥有的引用,而不绑定到任何恰好指向它的 C 指针。

这是否意味着每当返回值被丢弃时,ptr就会被垃圾收集?

流程old_lib.c如下:

PyObject* get_pyobject()
{
     PyTypedObject* typeptr = PyObject_NEW_VAR(MyType, &Type, size)
     fill_attribute(typeptr->attrib)
     return (PyObject*)typeptr
}
Run Code Online (Sandbox Code Playgroud)

PyObject_NEW_VAR在 python 标准库(我的版本中为 objimpl.h:196)中使用PyObject_InitVar. 因此,返回的引用是借用的引用,但根据 …

c python memory-leaks cython

5
推荐指数
1
解决办法
2765
查看次数

标签 统计

c ×1

cython ×1

memory-leaks ×1

python ×1