Имеется черновой код программы, которая ищет числа дающие в третьей или четвертой или пятой степени полиндромы. Сама программа уже написана как нужно, всё работает, всё путём, вопрос о другом. При работе этого кода:
long double numb;
std::stringstream stream;
std::string check;
bool flag;
for (int i = 0; true; ++i) {
for (int degree = 3; degree < 6; ++degree) {
numb = pow(i, degree);
stream << numb;
stream >> check;
stream.clear();
flag = true;
for (int j = 0; j < check.size() / 2; ++j) {
if (check[j] != check[check.size() - 1 - j]) {
flag = false;
break;
}
}
if (flag)
break;
}
if (flag)
std::cout << i << std::endl;
}
system("pause");
наблюдается утечка памяти и уже к седьмой минуте работы процесс уверено пожирает больше 800мб памяти. Выявил лишь, что виновником является мой метод преобразования числа в строку через поток, где-то в этих строках и происходит утечка:
stream << numb;
stream >> check;
stream.clear();
В чём именно причина утечки? Куда и на что уходит память?
Как таковой утечки нет, но есть кое-что другое. Вы пишите в stream всё дальше и дальше, без его очистки, поэтому данные в нем накапливаются.
stream.clear();
это не очищает буфер, а лишь сбрасывает флаги ошибок. Таким образом при повторяющихся записях
stream << numb;
размер буфера в stream становится всё больше и больше.
В качестве варианта решения можно установить новое значение для содержимого буфера:
stream.clear();
stream.str("");
Утечек в программе нет (я их не нашел), но есть другая проблема. Ваш код похоже надеется, что double может хранить достаточно большие числа без потери точности. А это не так. Более того, он надеется, что функция pow работать "правильно" (тут недавно был вопрос о ней).
Например, уже при i = 16 и degree = 5, получается check=1.04858e+06. Проверять такое на "симметрию" нет смысла. А когда i достигает 100, то все результаты уже представлены в таком виде.
Еще раз, рассуждать о палиндромности можно только для целых чисел, записанных просто числами, а не в научной форме.
Почему же "утечка" - нет утечки, просто менеджер памяти выделил память с запасом.
Но что делать, если очень сильно хочется найти? использовать целые числа для результата или найти любой класс для работы с большими числами.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники