这是我第一次使用 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/