Cython:将 C 结构转换为 pythons 对象会增加引用计数



我正在尝试将 C 指针结构转换为对象类型,同时这样做,无论字段是什么类型,结构的第一个字段都会递增 1。 这种行为是预期的,我不应该将 C 指针投射到对象还是 Cython 有问题?

示例代码:

C 结构体:

struct attr {
int a;
};

赛通: 像素:

cdef class Attr(object):
cdef attr * t

派克斯:

cdef class Attr(object):
__init__(self):
self.t = malloc(sizeof(attr))
self.t.a = 0
attr(self):
return <object>self.t

创建 Attr 并运行 Attr 方法"a"时,T 结构的字段正在递增 (这个例子只是我试图做的不可运行的例子) 感谢您的帮助

是的,这是意料之中的。

你可能的目标是Cython能够在C结构和Python字典之间自动转换。这不需要在Cython代码中<>转换即可发生。要使其正常工作,您需要告诉Cython有关结构成员的信息。不过,您确实需要取消引用指针:return self.t[0].

一个投<object>所做的是告诉Cython:"这个指针可以直接解释为PyObject*,我们现在负责引用计数。C API 的模式是,您有各种不同的结构,所有结构都声明为以PyObject_HEAD开头。然后,您可以将它们转换为PyObject*,因为结构开头的内存布局是相同的。由于您的结构没有此模式,因此您会得到无意义的结果。


(附录)我认为值得补充的是:这有可能比目前看起来更像一场灾难。如果 Python 认为是"refcount"达到 0,那么 Python 将尝试释放对象。PyObject的第二部分是指向定义类型的PyTypeObject的指针。一大堆东西(例如,释放,打印对象,几乎从Python与它进行的任何交互)都可能导致Python尝试查找这种类型的对象,并且由于该结构不包含指向有效PyTypeObject的指针,因此这将最终失败。

最新更新