Python を使用するのはこれが初めてなので、ご容赦ください。C++ クラスを含む SWIG モジュールを参照すると、28 バイトのメモリ リークが発生します。これはすべて、Visual Studio 2012 でビルドおよび実行されています。モジュールの .cpp ファイルは空で、ヘッダーは次のとおりです。
class foo{
public:
foo() {}
virtual ~foo() {}
};
SWIG の .i ファイルは次のとおりです。
%module SwigTest2
%{
#define SWIG_FILE_WITH_INIT
#include "SwigTest2.h"
%}
%include "SwigTest2.h"
最後に、このモジュールを C++ から埋め込むために使用しているコードを次に示します。
Py_Initialize();
PyObject* pPath = PySys_GetObject((char*)"path");
if(pPath)
{
CString csScriptFolder("C:\\Testing\\Debug");
PyList_Append(pPath, PyUnicode_FromString(csScriptFolder));
CString csPath("multiply");
PyObject* pName = PyUnicode_FromString(csPath);
if(pName != NULL)
{
PyObject* pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL)
{
Py_DECREF(pModule);
}
}
}
Py_Finalize();
これを実行すると、メモリリークを除いてすべてがうまくいきます。モジュールに実際のコードを入れると、正常に動作しますが、終了時に 28 バイトがリークします。モジュールに別のクラスを追加すると、さらに 28 バイトのリークが発生します。モジュールを 3 回実行すると 3 つのリークが発生するため、モジュールに 2 つのクラスがある場合、それぞれ 28 バイトの合計 6 つのリークが発生します。
1 つの可能性 (Python に関する私の一般的な無知は別として) は、c++ モジュールと c++ 実行可能ファイルのデバッグ バージョンをビルドしているときに、Python のリリース ビルドにリンクしていることです。もう 1 つは、クラス定義を削除して単純な古い関数を使用すると、メモリ リークがなくなり、すべて正常に動作することです。
どんな提案や助けも大歓迎です。御時間ありがとうございます。