【发布时间】:2018-11-25 10:48:11
【问题描述】:
我从 C 调用 Python 方法,10 小时后 PyObject_CallMethod 发生泄漏/段错误。
您能查看我的代码吗?我的错误在哪里?缺少什么?
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)
【问题讨论】:
-
您缺少到处都是错误检查!它们不是 C-API 的“可选”...
-
即您必须检查
PyList_New、toNDArray、PyList_Append、PyObject_CallMethod的返回值以及max的返回值PyList_GetItem;在这种情况下,可能是您的代码没有崩溃,但会以 MemoryError 退出。 -
你没关系,检查返回值/代码是最佳实践,它在我们的代码中完成,但我删除了这里的检查以减少代码。
-
当您没有显示这些错误检查时,我们如何验证它们是否正确!
标签: python c memory-leaks segmentation-fault