Утечка памяти в stringstream

240
13 февраля 2018, 08:21

Имеется черновой код программы, которая ищет числа дающие в третьей или четвертой или пятой степени полиндромы. Сама программа уже написана как нужно, всё работает, всё путём, вопрос о другом. При работе этого кода:

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();

В чём именно причина утечки? Куда и на что уходит память?

Answer 1

Как таковой утечки нет, но есть кое-что другое. Вы пишите в stream всё дальше и дальше, без его очистки, поэтому данные в нем накапливаются.

stream.clear();

это не очищает буфер, а лишь сбрасывает флаги ошибок. Таким образом при повторяющихся записях

stream << numb;

размер буфера в stream становится всё больше и больше. В качестве варианта решения можно установить новое значение для содержимого буфера:

stream.clear();
stream.str("");    
Answer 2

Утечек в программе нет (я их не нашел), но есть другая проблема. Ваш код похоже надеется, что double может хранить достаточно большие числа без потери точности. А это не так. Более того, он надеется, что функция pow работать "правильно" (тут недавно был вопрос о ней).

Например, уже при i = 16 и degree = 5, получается check=1.04858e+06. Проверять такое на "симметрию" нет смысла. А когда i достигает 100, то все результаты уже представлены в таком виде.

Еще раз, рассуждать о палиндромности можно только для целых чисел, записанных просто числами, а не в научной форме.

Почему же "утечка" - нет утечки, просто менеджер памяти выделил память с запасом.

Но что делать, если очень сильно хочется найти? использовать целые числа для результата или найти любой класс для работы с большими числами.

READ ALSO
Проверка домена через DNS Google

Проверка домена через DNS Google

Добрый день, помогите пожалуйстаРеализована вот такая простая проверка на подмену ip, но это можно обойти

188
Как моментально сменить обои?

Как моментально сменить обои?

Хочу сменить обои, но никак не могу найти действенный способНашёл вот такой способ, но получается только чёрный экран

255
Один большой файл или много мелких

Один большой файл или много мелких

Нужно записывать последние сообщения пользователей, если до этого было уже записано от него сообщение - перезаписать

211
Ошибка в функции с переменным числом параметров

Ошибка в функции с переменным числом параметров

Пытаюсь написать создание по формату std::string с помощью vsnprintf, но что-то где-то пошло не так и программа падает во время вызова vsnprintf

210