Python Api C генерирует утечку памяти - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть этот простой код для запуска небольшого 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, и у меня есть утечка памяти (здесь вывод ).После некоторого теста я обнаружил, что утечки памяти вызваны istruction Py_Initialize();.Как я могу решить эту проблему?

Я запускаю valgrind с этим флагом:

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

1 Ответ

1 голос
/ 30 апреля 2019

Выделенный вами вывод (в основном) не утечка памяти, а скорее неверное чтение. Это очень вероятно, вызвано очень особенным образом Питон управляет своей памятью.

Как часть исходных файлов python, вы должны найти файл подавления для valgrind, это должно подавлять эти сообщения, поскольку они не являются реальными ошибками.

Для моей версии Python 3.6.6 она находится в Python-3.6.6 / Misc / valgrind-python.supp

Итак, запустите вашу программу под valgrind, используя: valgrind --suppressions = path / to / the / python / Misc / valgrind-python.supp

Возможно, вам сначала понадобится: экспорт PYTHONMALLOC = malloc

...