首页 > 解决方案 > 变量没有被垃圾收集导致 C++ 进程内存增加

问题描述

我有一个这样的 Python 脚本:

import module
globalvariable a
def read(key):
    x = funcA(a, key)
    ret = funcB(x)
    if ret == True:
        return "Success"
    else:
        return "Failure"

我不时通过 Python-C-API 从我的 C++ 程序中重复调用此函数。我注意到每次调用此函数时,我的 C++ 进程内存都会不断增加。

经过大量调查:

  1. 运行 Valgrind
  2. 检查我的 C++ 代码中所有变量/PyObjects 的所有 Py_DECREF
  3. 确保我的代码不会在其他地方泄漏内存
  4. 用 boost python 替换我的原始 Python-C-API 并再次检查

我发现由于 Python 脚本本身而不是 Python-C-API,C++ 内存正在增加。我通过用一个虚拟脚本(没有变量并且不做任何事情)替换上面的脚本并重复调用相同的函数来确认这一点。进程内存是恒定的,这次没有增加。

如何强制 Python 垃圾收集器在每次函数调用后释放所有变量?我不知道 Python GC 是否/何时会释放内存。我注意到其他 stackoverflow 答案中的一些建议,即强制垃圾收集器收集是一件坏事。

如何确保每次调用 python 脚本时我的 c++ 进程都不会占用额外的内存?是否像在我声明的所有本地 python 变量上调用 del() 一样简单?还是有其他方法?

我还从导入的模块中调用了很多函数,我不知道这是否也会影响垃圾收集。

标签: pythonc++python-c-api

解决方案


推荐阅读