вот часть моего кода:
int Parser::SomeFunction(const QString &line, int start, int& fieldStart, int& fieldLength ) const
{
int end;
......
if (0 == m_pRegExp)
{
......
}
else
{
#ifdef KNOWN_PATTERN
end = 19;
#else
QRegularExpressionMatch match = m_pRegExp->match(line, start);
if (!match.hasMatch())
{
return 0;
}
// currently we are requiring match to be found exactly at the position 'start'
if (match.capturedStart() != start)
{
return 0;
}
end = match.capturedEnd();
#endif
}
.....
}
Программа загружает текстовый файл и анализирует его строки один за другим. Вся цель кода в 'else scope - вычислять, где поле заканчивается (целое число) в следующей строке, переданной функции. Когда я компилирую с помощью KNOWN_PATTERN #defined и загружаю некоторый тестовый файл, для которого я знаю, что конец должен стать 19, моя программа потребляет на 400 МБ меньше памяти, чем при компиляции без KNOWN_PATTERN #defined. 400 МБ - это то, что все строки моего тестового файла занимают в памяти (я могу рассчитать его на основе размера файла, а также наблюдать за потреблением памяти при загрузке файла и до начала синтаксического анализа). Поэтому мне кажется, что QRegularExpressionMatch создает копии каждой строки и не выпускает ее. Что мне здесь не хватает? Благодарю!
Диспетчер задач и т.д. - очень тупые инструменты для наблюдения за распределением памяти во время выполнения C++.
В частности, среда выполнения не обязательно выводит освобожденную память обратно в ОС, так как распределение памяти ОС относительно медленно на многих платформах, но держится за нее для себя.