2

python35.dll をロードするアプリがあります。Python API PyImport_AddModule を使用して、py ファイルを実行します。そして PyDict_DelItemString を使用してモジュールを削除します。py ファイルにはグローバル変数があります。モジュールを削除するために PyDict_DelItemString を呼び出しても、グローバル変数は破棄されません。Py_Finalize を呼び出すと、グローバル変数が破棄されます。手遅れです。それがメモリリークの原因です。Py_Initialize はアプリの起動時に呼び出されるため、Py_Finalize はアプリのシャットダウン時に呼び出されます。

ただし、python33.dll では問題ありません。PyDict_DelItemString を呼び出してモジュールを削除すると、グローバル変数が破棄される可能性があります。

問題を解決するには?回避策はありますか? 私は python35.dll を使用する必要があり、PyDict_DelItemString を呼び出してモジュールを削除するときに、モジュール内のグローバル変数が自動的に解放されることを望みます。

Python テスト コードは次のとおりです。

class Simple:  
     def __init__( self ):  
         print('Simple__init__')
     def __del__( self ):  
         print('Simple__del__') 

simple = Simple()
4

1 に答える 1

0

この問題は解決されました。Python 3.4 以降のバージョンでは、PyDict_DelItemString の後に PyGC_Collect を呼び出す必要があります。

詳細については、http://bugs.python.org/issue28202を参照してください。

于 2016-09-22T01:28:19.683 に答える