- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于如何在 C 中的 PyList 上正确使用 Py_DECREF()
的问题。假设我有一个名为 build_list()
的函数,它接受链接的字符串list 作为其输入参数,如果一切顺利,则返回一个 Python 列表,如果出现错误,则返回 NULL
。
下面是一个简单的例子:
struct strlist {
char *str;
size_t len;
struct strlist *next;
};
PyObject *build_list (struct strlist *inlist) {
struct strlist *node = NULL;
PyObject *tmp_obj = NULL;
int success;
PyObject *ret_obj = PyList_New(0);
if (ret_obj == NULL) {
return NULL;
}
node = inlist;
while (node != NULL) {
tmp_obj = PyString_FromStringAndSize(node->str, node->len);
if (tmp_obj == NULL) {
Py_DECREF(ret_obj);
return NULL;
}
else {
success = PyList_Append(ret_obj, tmp_obj);
Py_DECREF(tmp_obj);
if (success != 0) {
Py_DECREF(ret_obj);
return NULL;
}
}
node = node->next;
}
return ret_obj;
}
在这种情况下我是否正确使用了 Py_DECREF()
?
我的具体问题是:如果在发生错误之前已将一些元素附加到列表中,我的代码将直接减少对列表的引用(在 success != 0
内),而列表中的元素从技术上讲仍然具有 refcount 1. 在最终减少对列表的引用之前,我是否应该先减少每个元素的引用?
谢谢。
最佳答案
创建list
后,它的引用计数为 1。每个 string
天生的引用计数为 1,将其附加到列表中会将其增加到 2(因为 list
和您的函数引用它)。所以 DECREF
是正确的Append()
之后,因为您的函数不再使用 string
本身。在两个错误路径( tmp_obj == NULL
、 success != 0
)内, DECREF
荷兰国际集团list
-object 将释放该对象(因为它的引用计数现在为 0)。 list
-object 将遍历它的成员和 DECREF
其中每一个,减少每个 string
的引用计数到 0,释放它们。
长话短说:您的代码是正确的。列表中的元素必须具有(至少)1 的引用计数,因为列表正在引用它们。这是list
的独家责任DECREF
这是成员(member)。
作为练习,您可以尝试自己减少字符串的引用计数。解释器很可能会崩溃(可能在 exit()
处),因为当列表被释放时,字符串的引用计数变为 -1,从而触发断言。
关于Python C 扩展 : Py_DECREF for PyList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48471726/
当我运行以下代码时,while 循环从未停止。为什么? 当引用数为零时,PyObject指针会变为Null吗? #include #include int main() { Py_Init
我在将 Python 嵌入 C++ 时遇到问题。我正在使用 Mingw w64 gcc 和 64 位 Python 2.7.11。 #include int main(int argc, char
我有一个关于如何在 C 中的 PyList 上正确使用 Py_DECREF() 的问题。假设我有一个名为 build_list() 的函数,它接受链接的字符串list 作为其输入参数,如果一切顺利,则
我正在学习在 python 中定义“新类型”的教程,https://docs.python.org/2/extending/newtypes.html ,我不明白在这段代码中使用 Py_DECREF
我正在分析以下代码,它可以正确编译和运行,但会产生内存泄漏。 cfiboheap 是 Fibonacci 堆的 C 实现,以下代码是 cfiboheap 的 Cython 包装器(其中的一部分)。 我
在处理 PyList_Append 时,我在 Py_DECREF/INCREF 上迷路了。任何人都可以对以下代码发表评论吗? PyObject * bugmaybe(PyObject *self, P
我正在研究用于定义新类型的 Python C 扩展文档,并且刚刚完成了 Providing finer control over data attributes部分。 在本节中,他们更改了示例代码以确
我正在尝试将 Python 嵌入到 XLL 中,以允许在 Excel 中调用 Python 函数。 XLL 是一个 DLL,它还至少包含 2 个函数,这些函数告诉 Excel 如何从 DLL 注册或取
每当我调用我的函数时,每次调用都会增加大约 +10M 的内存使用量,所以我认为这里存在一些内存泄漏。 .... PyObject *pair = PyTuple_New(2), *item = PyL
我是一名优秀的程序员,十分优秀!