Python Api C产生内存泄漏

时间:2019-04-28 13:22:31

标签: python c memory-leaks valgrind

我有这个简单的代码,可以在python中运行一个小的C代码:

Py_Initialize();

string_module = PyUnicode_FromString((char *) "kmer_counter");
module = PyImport_Import(string_module);
function = PyObject_GetAttrString(module, (char *) "counter");
result = PyObject_CallFunction(function, "i", 5);

if ( !result ) {
    fprintf(stderr, "Exception:\n");
    PyErr_PrintEx(0);
    exit(1);
}

Py_DECREF(string_module);
Py_DECREF(module);
Py_DECREF(function);
Py_DECREF(result);

Py_Finalize();

我用valgrind测试了代码,并且内存泄漏(这里是output)。经过一些测试,我发现内存泄漏是由指令Py_Initialize();引起的。我该如何解决这个问题?

我使用以下标志运行valgrind:

  

valgrind --tool = memcheck --leak-check = full ./exe

1 个答案:

答案 0 :(得分:1)

突出显示的输出(主要)不是内存泄漏,而是 无效的读取。这些很可能是由非常特殊的方式引起的 python管理其内存。

作为python源文件的一部分,您应该找到valgrind的禁止文件, 应该抑制这些消息,因为它们不是真正的错误。

对于我的3.6.6 python版本,它位于Python-3.6.6 / Misc / valgrind-python.supp

因此,使用以下命令在valgrind下运行程序:    valgrind --suppressions = path / to / the / python / Misc / valgrind-python.supp

您可能还需要先执行以下操作: 导出PYTHONMALLOC = malloc