c-extension Python内存泄漏,为什么?
问题描述:
最近我有一个项目由C编写,扩展Python中, 我在while循环中调用Python,结果是内存增长永远不会停止。c-extension Python内存泄漏,为什么?
这里是代码:
main
{
while True {
if(SUCCESS != PyInit())
{
return -1;
}
PyDone();
usleep(1000);
}
}
int PyInit(void)
{
Py_Initialize();
if(!Py_IsInitialized())
{
printf("PyInit: Python Init fail!\n");
return FAILURE;
}
else
{
printf("Python Init succ!\n");
return SUCCESS;
}
}
void PyDone(void)
{
Py_Finalize();
}
,最后我的英语很差,希望我已经清楚地说明了这个问题。
答
for (;;) {
PyInitialize();
if (PyIsInitialized()) {
PyFinalize();
usleep(1000);
}
}
如果你的代码类似于此,而且似乎是内存泄漏,那么Python实现有过错,因为PyFinalize所谓的“释放由Python解释器分配的所有记忆”。关于PyFinalize,python站点声明:“由Python解释器分配的少量内存可能无法释放(如果发现泄漏,请报告)”。在leak的Python缺陷跟踪器中搜索表明这还没有被报告,所以我建议将这个bug报告给他们的bugtracker。
+0
是啊!我也在c-api中读过这篇文章,但我不知道如何报告,并且〜 – 2013-03-27 10:04:40
尝试使用valgrind运行。另外,只要CPython的垃圾收集器在最后一次尝试使用它时关心内存,它就会占用内存。 – 2013-03-26 02:36:39
@Joran Beasley我会尝试你说的。 – 2013-03-26 02:39:36
@Eric Urban在这种情况下,我们该怎么办CPython呢〜 – 2013-03-26 02:40:07