我的python代码将一些字典和列表传递给C,如下所示:
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; 这样的东西可以买吗?
int i = PyInt_AS_LONG(PyList_GetItem(PyDict_GetItem(inlist,PyList_GetItem(tokens,pi)),current_index[pi]))我需要在python中调用我的C函数10K次,在运行我的代码大约100次之后,它显示了段错误11。我如何修复它?
发布于 2016-01-24 20:06:12
我不建议这样做,您应该同时检查PyDict_GetItem和PyList_GetItem
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的角度来看,我无法看到DECREF在key参数中的作用,所以我认为不应该出现问题。
https://stackoverflow.com/questions/34980487
复制相似问题