【问题标题】:Memory leak when embedding python into my application将python嵌入我的应用程序时发生内存泄漏
【发布时间】:2017-08-15 18:04:11
【问题描述】:

以下程序在与 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 垃圾收集器是否存在可能导致这种情况的问题,并且它不是“真正的”内存泄漏?

【问题讨论】:

标签: python c++ memory-leaks python-c-api cpython


【解决方案1】:

以上答案将所有内容放在一起

#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();
        
    }

}

【讨论】:

    【解决方案2】:

    Py_Finalize — Python/C API Reference Manual(强调我的):

    <...>
    Bug 和警告: 模块和模块中对象的销毁是 以随机顺序完成;这可能会导致析构函数(__del__() 方法) 当它们依赖于其他对象(甚至函数)或模块时失败。 Python 加载的动态加载的扩展模块不是 已卸载。 Python 解释器分配的少量内存 可能无法释放(如果发现泄漏,请报告)。记忆捆绑 up 在对象之间的循环引用不会被释放。一些记忆 由扩展模块分配的可能不会被释放。一些扩展可能 如果他们的初始化例程被调用超过 一次;如果应用程序调用 Py_Initialize() 和 Py_Finalize() 不止一次。

    猜你喜欢
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多