以下程序与 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垃圾收集器是否有某些东西可能导致这种情况,并且它不是“真正的”内存泄漏?
Py_Finalize— Python/C API 参考手册 https://docs.python.org/2/c-api/init.html#c.Py_Finalize(强调我的):
<...>
错误和警告:模块和模块中对象的销毁是
以随机顺序完成;这可能会导致析构函数(__del__() 方法)
当它们依赖于其他对象(甚至函数)或模块时会失败。Python 加载的动态加载的扩展模块不是
卸载。Python解释器分配的少量内存
可能无法释放(如果您发现泄漏,请报告)。内存绑定
对象之间的循环引用没有被释放。一些记忆
由扩展模块分配的空间可能无法释放。一些扩展可能
如果调用它们的初始化例程超过
一次;如果应用程序调用 Py_Initialize() 并且
Py_Finalize() 多次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)