YOU*_*YOU 7 c python reference-counting
每当我调用我的函数时,每个调用的内存使用量增加大约+ 10M,所以我认为这里有一些内存泄漏.
....
PyObject *pair = PyTuple_New(2), *item = PyList_New(0);
PyTuple_SetItem(pair, 0, PyInt_FromLong(v[j]));
if(v[j] != DISTANCE_MAX && (p[j] || d[0][j])){
jp=j;
while(jp!=istart) {
PyList_Append(item, PyInt_FromLong(jp));
jp=p[jp];
}
PyList_Append(item, PyInt_FromLong(jp));
PyList_Reverse(item);
}
PyTuple_SetItem(pair, 1, item);
return pair;
....
Run Code Online (Sandbox Code Playgroud)
当我阅读文档时,有些调用就像
void
bug(PyObject *list)
{
PyObject *item = PyList_GetItem(list, 0);
PyList_SetItem(list, 1, PyInt_FromLong(0L));
PyObject_Print(item, stdout, 0); /* BUG! */
}
Run Code Online (Sandbox Code Playgroud)
需要像这样引用引用计数
void
no_bug(PyObject *list)
{
PyObject *item = PyList_GetItem(list, 0);
Py_INCREF(item);
PyList_SetItem(list, 1, PyInt_FromLong(0L));
PyObject_Print(item, stdout, 0);
Py_DECREF(item);
}
Run Code Online (Sandbox Code Playgroud)
那么,我应该把Py_INCREF和Py_DECREF放在我的函数上?
glg*_*lgl 10
使用PyInt_FromLong()创建的对象以及添加到列表中的对象应保存在局部变量中.
原因是所有权规则:PyInt_FromLong()生成您拥有的引用.在对PyTuple_SetItem()的调用中,你再次失去了这个所有权,因为PyTuple_SetItem()从你那里"窃取"它,所以你不必关心.但是PyList_Append()没有这样做,它增加了引用计数.为了正确地使用GC,您必须通过DECREF来释放您的所有权.
因此,您可以执行以下操作,而不是PyList_Append(item,PyInt_FromLong(jp)):
PyObject * jpo = PyInt_FromLong(jp);
// do some error checking here
PyList_Append(item, jpo);
Py_DECREF(jpo);
Run Code Online (Sandbox Code Playgroud)
这将使程序做正确的事情.
| 归档时间: |
|
| 查看次数: |
5783 次 |
| 最近记录: |