首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python-c-api引用计数

python-c-api引用计数
EN

Stack Overflow用户
提问于 2016-01-24 19:36:01
回答 1查看 574关注 0票数 0

我的python代码将一些字典和列表传递给C,如下所示:

代码语言:javascript
复制
if (!PyArg_ParseTuple(args, "O!lO!O!O!O!O!", &PyList_Type,&list,&los,&PyDict_Type,&entity_len,&PyDict_Type,&inlist_len,&PyList_Type,&inindex,&PyDict_Type,&inlist,&PyList_Type,&tokens))
        return NULL; 

这样的东西可以买吗?

代码语言:javascript
复制
int i = PyInt_AS_LONG(PyList_GetItem(PyDict_GetItem(inlist,PyList_GetItem(tokens,pi)),current_index[pi]))

我需要在python中调用我的C函数10K次,在运行我的代码大约100次之后,它显示了段错误11。我如何修复它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-24 20:06:12

我不建议这样做,您应该同时检查PyDict_GetItemPyList_GetItem

代码语言:javascript
复制
PyObject *obj = PyList_GetItem(args)
if(!obj){
    return NULL
}
// Same for PyDict_GetItem with the difference
// that PyDict won't set an exception, so you 
// probably need to set it yourself.

两个*_GetItem函数在出问题时都返回NULL。因此,如果您只是简单地链接这些调用而没有进行正确的错误检查,那么如果其中一个返回NULL,您就会遇到问题。

另外,这两个函数都是https://docs.python.org/3/extending/extending.html#reference-counting-in-python

借款而不是拥有引用的好处是,您不需要处理代码中所有可能路径上的引用--换句话说,使用借来的引用,在过早退出时不会有泄漏的风险。借款多于拥有的缺点是,在一些看似正确的代码中,借用引用可以在被借来的所有者实际上已经处理掉之后使用。

(强调地雷)

因此,您通常不应该担心Py_DECREF对它们的处理。但是,要小心;如果您需要使用引用、存储它或将它传递到其他地方,您应该增加它的引用并获得它的所有权。

最后,当您传递对PyDict的借用引用时,我还不能百分之百地确定结果是什么;在文档中找不到什么。但是,从PyDict_GetItem的角度来看,我无法看到DECREFkey参数中的作用,所以我认为不应该出现问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34980487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档