【发布时间】:2021-03-01 07:50:38
【问题描述】:
这是我的代码。
PyObject *dataPyParams = PyList_New(0);
for (int i = 0; i < figdata.dataSetList.size(); i++)
{
PyObject *pyParams = PyList_New(0);
for (int j = 0; j < figdata.dataSetList[i].size(); j++)
{
//std::cerr << figdata.dataSetList[i][j] << "data\n";
auto temp = Py_BuildValue("f", figdata.dataSetList[i][j]);
PyList_Append(pyParams,temp);
Py_DECREF(temp);
}
PyList_Append(dataPyParams, pyParams);
Py_DECREF(pyParams);
}
Py_DECREF(dataPyParams);
我调用了 Py_DECREF(dataPyParams),dataPyParams 引用为 0,但内存不是空闲的。 我尝试删除 PyList_Append(pyParams,temp),这样可以释放内存。这很困扰我。
【问题讨论】:
-
你如何测量内存?你如何检查“内存不是空闲的”?
-
我认为您可以将内部循环替换为
PyList_SetItem(pyParams, Py_BuildValue(...)),因为它将获取引用。 -
我在windows任务管理器里看到了。
-
这不可靠或不足以衡量实际的内存泄漏。尝试找到一些内存分析工具来帮助您衡量实际分配和空闲。
-
@AaronD.Marasco:这仅在
list已预先确定大小并且您正在填写现有但未填充的索引时才有效。他们使用了PyList_New(0),这就排除了这一点。
标签: python c python-extensions