我从 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)
我认为问题是你不应该有以下行:
Py_INCREF(pValue)
原因是PyObject_CallMethod
已经为您增加了引用计数。 如果执行额外的Py_INCREF
调用给定PyObject
的引用计数将永远不会变为 0。
根据文档,PyObject_CallMethod
返回一个新的引用。
要理解"新引用"的含义,而不是"借用的引用",请查看文档的"引用计数详细信息">部分的第一段: