Python Api C 产生内存泄漏

Python Api C generate memory leak

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

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

您突出显示的输出(大部分)不是内存泄漏,而是 无效读取。这些很可能是由于非常特殊的方式造成的 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