PyObject_CallMethod泄漏/ seg错误

时间:2018-06-15 14:59:16

标签: python c memory-leaks segmentation-fault

我从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)

1 个答案:

答案 0 :(得分:1)

我认为问题在于你不应该有以下几行:

Py_INCREF(pValue)

原因是PyObject_CallMethod已经为您增加了引用计数。如果您执行额外的Py_INCREF调用,则给定PyObject的引用计数将永远不会为0。

根据文件PyObject_CallMethod returns a new reference

要理解&#34;新参考&#34; 的含义,而不是&#34;借用参考&#34; 请查看第一段文档的Reference Count Details部分: