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

标签 c++ python memory-leaks visual-studio-2012 swig

这是我第一次使用 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”来解决这个问题。调试有效,但内存泄漏消失了。抱歉重复的帖子...

关于c++ - SWIG、Python 和 Visual Studio 2012 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14197366/

相关文章:

objective-c - plist 文件加载的 NSDictionary 内存泄漏

c++ - DLL中静态变量的状态

C++ std::auto_ptr 复制构造函数

python - 在 Django 中自定义 TabularInline

使用 goto 语句对 C++ block 进行 Python 化处理

python - 为什么 "pack"的结果不等于手动创建的字节数组?

swift - 保留类和结构之间的循环

C++ 继承 : How to get Size of called object?

c++ - 从 pcap 文件中过滤数据包

ios - 需要帮助修复内存泄漏 - NSMutableString