2017-03-23 12 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

私は一般的にあなたが '初期化する'と 'finalize'を1回と思いますので、リークは定数であり、まったくメモリリークではありません。 – leovp

答えて

4

Py_Finalize — Python/C API Reference Manual(強調鉱山):

<...>
バグおよび注意事項:モジュールのモジュールとオブジェクトの破壊が はランダムな順序で行われます。これにより、デストラクタ(__del __()メソッド) が他のオブジェクト(関数も含む)やモジュールに依存しているときに失敗する可能性があります。 Pythonによってロードされた動的にロードされた拡張モジュールは、 がアンロードされていません。 Pythonインタプリタ によって割り当てられた少量のメモリが解放されないことがあります(漏れが見つかった場合は報告してください)。オブジェクト間の循環参照でメモリが結びついている は解放されません。拡張モジュールによって割り当てられた一部のメモリ は解放されません。一部の拡張機能は、 が初期化ルーチンに を1回以上呼び出すと正常に動作しないことがあります。これは、アプリケーションが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 -ページ –

関連する問題