草庐IT

python - Py_INCREF/DECREF : When

以下说法是否正确:如果在C函数中创建了Python对象,但该函数不返回它,则不需要INCREF,但需要一个DECREF。[false]如果函数确实返回它,你确实需要INCREF,在接收返回值的函数中。[/false]将C类型变量作为属性(如double、int等)分配给Python对象时,没有INCREF或DECREF是必需的。以下内容可以安全使用吗?将Python对象作为属性分配给其他Python对象如下所示:PyObject*foo;foo=bar;//APythonobjecttmp=self->foo;Py_INCREF(foo);self->foo=foo;Py_XDECRE

python - Py_INCREF/DECREF : When

以下说法是否正确:如果在C函数中创建了Python对象,但该函数不返回它,则不需要INCREF,但需要一个DECREF。[false]如果函数确实返回它,你确实需要INCREF,在接收返回值的函数中。[/false]将C类型变量作为属性(如double、int等)分配给Python对象时,没有INCREF或DECREF是必需的。以下内容可以安全使用吗?将Python对象作为属性分配给其他Python对象如下所示:PyObject*foo;foo=bar;//APythonobjecttmp=self->foo;Py_INCREF(foo);self->foo=foo;Py_XDECRE

c++ - 原子 decref 实现之间的区别

我一直在研究原子引用计数的实现。库之间的大多数操作都非常一致,但我在“减少引用计数”操作中发现了惊人的多样性。(请注意,通常情况下,shared和weakdecref之间的唯一区别是调用了哪个on_zero()。异常(exception)情况在下面注明。)如果除了“我们使用seq_cst因为我们不知道更好的东西”之外还有其他根据C11/C++11模型实现的实现(MSVC做了什么?),请随意编辑它们中。大多数示例最初是C++,但在这里我将它们重写为C,内联并规范化为>=1约定:#include#includetypedefstructRefPtrRefPtr;structRefPtr{_

python - 在 Python C 扩展中,我应该将 Py_INCREF 和 Py_DECREF 放在这个 block 的什么位置?

每当我调用我的函数时,每次调用都会增加大约+10M的内存使用量,所以我认为这里存在一些内存泄漏。....PyObject*pair=PyTuple_New(2),*item=PyList_New(0);PyTuple_SetItem(pair,0,PyInt_FromLong(v[j]));if(v[j]!=DISTANCE_MAX&&(p[j]||d[0][j])){jp=j;while(jp!=istart){PyList_Append(item,PyInt_FromLong(jp));jp=p[jp];}PyList_Append(item,PyInt_FromLong(jp))

python - 对于 Python C 扩展,使用 Py_DECREF 而不是 Py_XDECREF 有什么好处吗?

我正在研究用于定义新类型的PythonC扩展文档,并且刚刚完成了Providingfinercontroloverdataattributes部分。在本节中,他们更改了示例代码以确保Noddy结构的first和last属性永远不会是NULL,例如,通过在new中将属性初始化为空字符串,并添加getter和setter,如果用户尝试删除或以其他方式设置这些属性,则会引发TypeError属性为Null。此外(也是我的问题的重点),作者将这些属性的所有Py_XDECREF更改为Py_DECREF,并指出:Withthesechanges,wecanassurethatthefirstand