2013-03-26 90 views
0

最近我有一个项目由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(); 
} 

,最后我的英语很差,希望我已经清楚地说明了这个问题。

+0

尝试使用valgrind运行。另外,只要CPython的垃圾收集器在最后一次尝试使用它时关心内存,它就会占用内存。 – 2013-03-26 02:36:39

+0

@Joran Beasley我会尝试你说的。 – 2013-03-26 02:39:36

+0

@Eric Urban在这种情况下,我们该怎么办CPython呢〜 – 2013-03-26 02:40:07

回答

0
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