Имеется черновой код программы, которая ищет числа дающие в третьей или четвертой или пятой степени полиндромы. Сама программа уже написана как нужно, всё работает, всё путём, вопрос о другом. При работе этого кода:
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, то все результаты уже представлены в таком виде.
Еще раз, рассуждать о палиндромности можно только для целых чисел, записанных просто числами, а не в научной форме.
Почему же "утечка" - нет утечки, просто менеджер памяти выделил память с запасом.
Но что делать, если очень сильно хочется найти? использовать целые числа для результата или найти любой класс для работы с большими числами.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Добрый день, помогите пожалуйстаРеализована вот такая простая проверка на подмену ip, но это можно обойти
Хочу сменить обои, но никак не могу найти действенный способНашёл вот такой способ, но получается только чёрный экран
Нужно записывать последние сообщения пользователей, если до этого было уже записано от него сообщение - перезаписать
Пытаюсь написать создание по формату std::string с помощью vsnprintf, но что-то где-то пошло не так и программа падает во время вызова vsnprintf