以下程序,当链接到python 2.7.13并在Windows 10上运行时缓慢但稳定地泄漏内存。
#include <Python.h>
#include <iostream>
int main()
{
std::cout << "Python version: " << PY_VERSION << std::endl;
while (true)
{
Py_Initialize();
//PyGC_Collect();
Py_Finalize();
}
return 0;
}
有趣的事实是,似乎并非每次迭代都会泄漏内存。但我所看到的是,无论泄漏如何,python打印缓慢的引用计数增加了每次迭代大约90次的(非常量)计数。使用Visual Studio诊断工具我发现当从磁盘读取已编译的模块时,泄漏来自对PyImport_ImportModule()
的调用(实际调用堆栈有几个级别)。
是否需要我不知道的其他清理步骤?或者是有什么关于Python垃圾收集器可能会导致这一点,它不是一个真实的&#34;内存泄漏?
答案 0 :(得分:5)
Py_Finalize
— Python/C API Reference Manual(强调我的):
&LT; ...&GT;
错误和警告:模块中模块和对象的销毁是 以随机顺序完成;这可能会导致析构函数(__del __()方法) 当它们依赖于其他对象(甚至函数)或模块时失败。 由Python加载的动态加载的扩展模块不是 卸载。 Python解释器分配的少量内存 可能没有被释放(如果发现泄漏,请报告)。内存并列 不释放对象之间的循环引用。一些记忆 由扩展模块分配的可能不会被释放。一些扩展可能 如果他们的初始化例程被调用超过,则无法正常工作 一旦;如果应用程序调用Py_Initialize()和,则会发生这种情况 Py_Finalize()不止一次。
答案 1 :(得分:0)
以上答案将所有内容整合在一起
#include <Python.h>
int main(int argc, char *argv[])
{
Py_Initialize();
wchar_t *name = Py_DecodeLocale(argv[0], NULL);
Py_SetProgramName(name);
pythonlovesC();
Py_Finalize();
return 0;
}
void pythonlovesC()
{
while (true)
{
// do your python stuff here
PyGC_Collect();
}
}