PyObject_CallMethod泄漏/赛格故障



我从 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返回一个新的引用。

要理解"新引用"的含义,而不是"借用的引用",请查看文档的"引用计数详细信息">部分的第一段:

相关内容

  • 没有找到相关文章

最新更新