2013-03-26 297 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