将 python 嵌入到我的应用程序中时出现内存泄漏

2024-05-04

以下程序与 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(使用前将#替换为@)

将 python 嵌入到我的应用程序中时出现内存泄漏 的相关文章