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

时间:2017-03-23 09:17:55

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

以下程序,当链接到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;内存泄漏?

2 个答案:

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

}