SWIG、Python和Visual Studio 2012的内存泄漏

Memory leak with SWIG, Python and Visual Studio 2012

本文关键字:2012 内存 泄漏 Studio Visual Python SWIG      更新时间:2023-10-16

这是我第一次使用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的发布版本。另一件事是,如果我删除类定义并使用普通的旧函数,内存泄漏就会消失,一切都可以正常工作。

任何建议或帮助都是非常感谢的。感谢您的宝贵时间。

我能够通过将运行时库设置为"多线程DLL"而不是"多线程调试DLL"来解决这个问题。调试工作,但内存泄漏消失了。