Cython:将 C 结构转换为 pythons 对象会增加引用计数
Cython: casting C struct to pythons object increases refcount
我正在尝试将 C 指针结构转换为对象类型,同时,无论该字段是什么类型,该结构的第一个字段都会递增 1。
这种行为是预期的吗?我不应该将 C 指针转换为对象,或者 Cython 有问题?
示例代码:
C 结构:
struct attr {
int a;
};
赛通:
pxd:
cdef class Attr(object):
cdef attr * t
pyx:
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:"this pointer can be directly interpreted as PyObject*
, and we are now responsible for reference counting it." C API 中的模式是您有各种不同的结构,所有结构都声明为以 [=14= 开头].然后您可以将它们转换为 PyObject*
或从 PyObject*
转换,因为结构开头的内存布局是相同的。由于您的结构没有这种模式,因此您会得到无意义的结果。
(附录) 我认为值得补充:这有可能成为比目前看起来更严重的灾难。如果 Python 认为 "refcount" 达到 0,则 Python 将尝试释放该对象。 PyObject
的第二部分是指向定义类型的 PyTypeObject
的指针。一大堆事情(例如释放,打印对象,几乎所有来自 Python 的交互)都可能导致 Python 尝试查找此类型对象,并且由于该结构不包含指向有效 PyTypeObject
的指针,那么这将最终失败。
我正在尝试将 C 指针结构转换为对象类型,同时,无论该字段是什么类型,该结构的第一个字段都会递增 1。 这种行为是预期的吗?我不应该将 C 指针转换为对象,或者 Cython 有问题?
示例代码:
C 结构:
struct attr {
int a;
};
赛通: pxd:
cdef class Attr(object):
cdef attr * t
pyx:
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:"this pointer can be directly interpreted as PyObject*
, and we are now responsible for reference counting it." C API 中的模式是您有各种不同的结构,所有结构都声明为以 [=14= 开头].然后您可以将它们转换为 PyObject*
或从 PyObject*
转换,因为结构开头的内存布局是相同的。由于您的结构没有这种模式,因此您会得到无意义的结果。
(附录) 我认为值得补充:这有可能成为比目前看起来更严重的灾难。如果 Python 认为 "refcount" 达到 0,则 Python 将尝试释放该对象。 PyObject
的第二部分是指向定义类型的 PyTypeObject
的指针。一大堆事情(例如释放,打印对象,几乎所有来自 Python 的交互)都可能导致 Python 尝试查找此类型对象,并且由于该结构不包含指向有效 PyTypeObject
的指针,那么这将最终失败。