2

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 つは、クラス定義を削除して単純な古い関数を使用すると、メモリ リークがなくなり、すべて正常に動作することです。

どんな提案や助けも大歓迎です。御時間ありがとうございます。

4

1 に答える 1

1

ランタイム ライブラリを「マルチスレッド デバッグ DLL」ではなく「マルチスレッド DLL」に設定することで、これを回避できました。デバッグは機能しますが、メモリ リークはなくなりました。重複投稿すみません…

于 2013-01-10T14:41:27.093 に答える