Следующая программа, если она связана с python 2.7.13 и работает в Windows 10 медленно, но постоянно теряет память.
#include <Python.h>
#include <iostream>
int main()
{
std::cout << "Python version: " << PY_VERSION << std::endl;
while (true)
{
Py_Initialize();
//PyGC_Collect();
Py_Finalize();
}
return 0;
}
Интересен тот факт, что, похоже, не каждая итерация теряет память. Тем не менее, я вижу, что счетчик ссылок, который печатает python, медленно увеличивается на (неконстантный) счет приблизительно в 90 за каждую итерацию, независимо от утечки. Используя средства диагностики Visual Studio, я выяснил, что утечка происходит из-за вызова PyImport_ImportModule()
когда он читает скомпилированный модуль с диска (фактический стек вызовов имеет несколько уровней).
Нужны ли какие-либо дополнительные шаги по очистке, о которых я не знаю? Или что-то в сборщике мусора Python может вызвать это, и это не «настоящая» утечка памяти?
Py_Finalize
— Справочное руководство по API Python / C (выделение мое):
<…>
Ошибки и предостережения: Уничтожение модулей и объектов в модулях
сделано в случайном порядке; это может вызвать деструкторы (__del __ () методы)
потерпеть неудачу, когда они зависят от других объектов (даже функций) или модулей.
Динамически загружаемые модули расширения, загружаемые Python, не являются
выгружен. Небольшие объемы памяти, выделяемые интерпретатором Python
может не быть освобожден (если вы обнаружили утечку, пожалуйста, сообщите об этом). Память связана
циклические ссылки между объектами не освобождаются. Немного памяти
выделенные модулями расширения не могут быть освобождены. Некоторые расширения могут
не работает должным образом, если их процедура инициализации называется более
один раз; это может произойти, если приложение вызывает Py_Initialize () и
Py_Finalize () более одного раза.
Других решений пока нет …