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 个类,我最终会得到 6 个总泄漏,每个泄漏 28 个字节。

一种可能性(除了我对 Python 的一般无知之外)是我在构建我的 c++ 模块和 c++ 可执行文件的调试版本时链接到 Python 的发布版本。另一件事是,如果我删除类定义并使用普通的旧函数,内存泄漏就会消失,一切正常。

非常感谢任何建议或帮助。谢谢你的时间。

4

1 回答 1

1

我可以通过将运行时库设置为“多线程 DLL”而不是“多线程调试 DLL”来解决这个问题。调试工作,但内存泄漏消失了。对不起,重复的帖子...

于 2013-01-10T14:41:27.093 回答