2017-03-23 36 views
1

以下程序在與python 2.7.13鏈接並在Windows 10上運行時緩慢但穩定地泄漏內存。將python嵌入我的應用程序時發生內存泄露

#include <Python.h> 
#include <iostream> 

int main() 
{ 
    std::cout << "Python version: " << PY_VERSION << std::endl; 

    while (true) 
    { 
     Py_Initialize(); 
     //PyGC_Collect(); 
     Py_Finalize(); 
    } 

    return 0; 
} 

有趣的是,似乎不是每一次迭代都會泄漏內存。然而,我所看到的是,無論泄漏如何,python打印的引用計數緩慢增加了大約90次(非常數)的迭代次數。使用Visual Studio診斷工具我發現當從磁盤讀取編譯模塊(實際的調用堆棧深度高達幾個級別)時,調用PyImport_ImportModule()時發生泄漏。

是否需要我不知道的其他清理步驟?或者是有什麼關於Python垃圾回收器可能會導致這種情況,它不是一個「真正的」內存泄漏?

+0

我認爲你一般'初始化'一次,'敲定'一次,所以泄漏是一個常量,這使得它不是內存泄漏。 – leovp

回答

4

Py_Finalize — Python/C API Reference Manual(重點煤礦):

<...>
錯誤和警告:模塊的模塊和對象的破壞是 隨機順序進行;這可能會導致析構函數(__del __()方法) 在依賴於其他對象(偶函數)或模塊時失敗。 Python加載的動態加載的擴展模塊不是 未加載。由Python解釋器 分配的少量內存可能無法釋放(如果發現泄漏,請報告)。內存捆綁 在對象之間循環引用不釋放。某些由擴展模塊分配的內存 可能不會被釋放。如果其初始化例程被調用超過 一次,則某些擴展可能無法正常工作;如果一個應用程序不止一次調用Py_Initialize()和Py_Finalize(),就會發生這種情況。

+0

我現在覺得很愚蠢...... – sigy

+0

@sigy http://meta.serverfault.com/questions/8934/what-to-do-with-questions-when-the-answer-is-in-a-man -頁 –

相關問題