python-3.x - Cython:将 C 结构转换为 pythons 对象会增加引用计数
问题描述
我正在尝试将 C 指针结构强制转换为对象类型,同时,无论该字段是什么类型,该结构的第一个字段都将递增 1。这种行为是预期的,我不应该将 C 指针转换为对象,或者 Cython 有问题吗?
示例代码:
C结构:
struct attr {
int a;
};
赛通:pxd:
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 方法时,t struct 的“a”字段正在递增(此示例只是我试图不运行的示例)感谢您的帮助
解决方案
是的,这是意料之中的。
您可能的目标是 Cython 能够在 C 结构和 Python 字典之间自动转换。无需<>
在您的 Cython 代码中进行强制转换即可发生这种情况。为了让它工作,你需要告诉 Cython 结构成员。您确实需要取消引用指针:return self.t[0]
.
强制转换的<object>
作用是告诉 Cython:“这个指针可以直接解释为PyObject*
,我们现在负责对它进行引用计数。” C API 的模式是,您有各种不同的结构,都声明为以PyObject_HEAD
. 然后,您可以将它们转换为和转换,PyObject*
因为结构开头的内存布局是相同的。由于您的结构没有这种模式,您会得到无意义的结果。
(附录)我认为值得补充的是:这有可能比现在看起来更像一场灾难。如果 Python 认为“引用计数”达到 0,那么 Python 将尝试释放该对象。a 的第二部分PyObject
是指向PyTypeObject
定义类型的 的指针。一大堆事情(例如释放、打印对象、几乎任何与 Python 的交互)都可能导致 Python 尝试查找此类型对象,并且由于该结构不包含指向有效的指针,PyTypeObject
因此这将结束失败了。
推荐阅读
- gremlin - 如何从 gremlin 中不同顶点的属性中获取结果?
- reactjs - 将鼠标悬停在图表上时 react-chartjs-2 垂直线
- python - Dask Parquet 加载带有数据模式的文件
- python - 詹金斯运行后台脚本?
- c - 在 C 中切换数组的元素
- angular - 在 Angular 库中使用 RxJS
- android - sqlite,如何从保存在列中的 CSV 替换值
- laravel - 使用 spatie 进行分页总是在 url 中显示 paginateroute::paginateroute
- android - 我不能使用 labelVisibilityMode
- mysql - MySQL状态变化之间的时间差