【问题标题】:Python Api C generate memory leakPython Api C 产生内存泄漏
【发布时间】:2019-09-17 07:54:51
【问题描述】:

我有这个简单的代码可以在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 3.7?)看看问题是否仍然存在?
  • @Jean-FrançoisFabre 我该如何指定?
  • 安装一个新的python版本。输出显示您使用的是 2.7
  • @Jean-FrançoisFabre 我安装了 python3.7 但如果我使用这个标志 -I/usr/include/python3.7 -lpython3.7,它找不到库
  • 可能是-lpython37。而-I用于编译包含,链接路径需要-L

标签: python c memory-leaks valgrind


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多