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

sig*_*igy 2 c++ python memory-leaks cpython python-c-api

以下程序,当链接到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;
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,似乎并非每次迭代都会泄漏内存.但我所看到的是,无论泄漏如何,python打印缓慢的引用计数增加了每次迭代大约90次的(非常量)计数.使用Visual Studio诊断工具我发现泄漏来自于PyImport_ImportModule()从磁盘读取已编译模块时的调用(实际调用堆栈深度为几级).

是否还需要我不知道的额外清理步骤?或者有什么关于Python垃圾收集器可能导致这一点,它不是一个"真正的"内存泄漏?

iva*_*eev 5

Py_Finalize- Python/C API参考手册(强调我的):

<...>
错误和警告:模块中模块和对象的破坏是按随机顺序完成的; 这可能导致析构函数(__del __()方法)在依赖于其他对象(甚至函数)或模块时失败. 不加载由Python加载的动态加载的扩展模块.Python解释器分配的少量内存可能无法释放(如果发现泄漏,请报告).不释放在对象之间的循环引用中绑定的内存.扩展模块分配的某些内存可能无法释放.如果多次调用初始化例程,某些扩展可能无法正常工作; 如果应用程序多次调用Py_Initialize()和Py_Finalize(),就会发生这种情况.