我从C调用Python方法,并在10小时后在PyObject_CallMethod上泄漏/ seg错误。
您可以查看我的代码吗?我的错误在哪里?想念少数人?
C代码:
PyObject *pFrameAsList = PyList_New(0);
...
for (int k=0; k<m_nbImages; ++k)
{
PyObject *pFrameAsArray = toNDArray(frame);
...
PyList_Append(pFrameAsList, pFrameAsArray);
Py_DECREF(pFrameAsArray);
}
PyObject *pValue = PyObject_CallMethod(pInstance, "analyseFrame", "(O)", pFrameAsList);
...
Py_INCREF(pValue);
...
for (int k=0 ; k<max; k++ )
{
PyObject *ptemp = PyList_GetItem(pValue,k);
}
Py_DECREF(pFrameAsList);
Py_DECREF(pValue);
Python代码:
def analyseFrame(self, frame):
results = self.model.analyse(np.asarray(frame))
return list(results)
答案 0 :(得分:1)
我认为问题在于你不应该有以下几行:
Py_INCREF(pValue)
原因是PyObject_CallMethod
已经为您增加了引用计数。如果您执行额外的Py_INCREF
调用,则给定PyObject
的引用计数将永远不会为0。
根据文件PyObject_CallMethod
returns a new reference。
要理解&#34;新参考&#34; 的含义,而不是&#34;借用参考&#34; 请查看第一段文档的Reference Count Details部分: