Добрый день, есть поток, бесконечный(он же сервис), в котором постоянно происходит запись в файл и вот при записи в файл происходит утечка памяти, не могу понять почему, может кто скажет, вот исходный код:
Здравствуйте, arfaa, Вы писали:
A>Добрый день, есть поток, бесконечный(он же сервис), в котором постоянно происходит запись в файл и вот при записи в файл происходит утечка памяти, не могу понять почему, может кто скажет, вот исходный код:
A>как видно в коде, пробовал и через QFile и через std::ofstream, если закомментировать строку ввода в поток : A>
A>то утечки нет, почему так происходит и как с этим бороться?
в вашем коде нет создания и типа message,
а телепаты как всегда где-то там, но не здесь.
И если используете инструмент для анализа утечек,
почему он не сообщает какая память и где именно утекает?
Здравствуйте, Zhendos, Вы писали:
Z>Здравствуйте, arfaa, Вы писали:
A>>Добрый день, есть поток, бесконечный(он же сервис), в котором постоянно происходит запись в файл и вот при записи в файл происходит утечка памяти, не могу понять почему, может кто скажет, вот исходный код:
A>>как видно в коде, пробовал и через QFile и через std::ofstream, если закомментировать строку ввода в поток : A>>
A>>то утечки нет, почему так происходит и как с этим бороться?
Z>в вашем коде нет создания и типа message, Z>а телепаты как всегда где-то там, но не здесь. Z>И если используете инструмент для анализа утечек, Z>почему он не сообщает какая память и где именно утекает?
Здравствуйте, reversecode, Вы писали:
R>а что дебагеры и прочие средства поиска утечек уже не в моде ?
на моем компьютере утечка не воспроизводится, воспроизводится на другом компьютере, где ни студии ничего нет, поэтому и спрашиваю, реальна ли такая утечка ? или это какой-то глюк?
это можно выяснять только с тем у кого это как вы говорите воспроизводится
а средства отладки и перформенса по мемори ликам итд вы и сами можете добавить в свой тестовый билд,
и отправить тому у кого якобы воспроизводите, для локализации проблемы
Здравствуйте, reversecode, Вы писали:
R>это можно выяснять только с тем у кого это как вы говорите воспроизводится R>а средства отладки и перформенса по мемори ликам итд вы и сами можете добавить в свой тестовый билд, R>и отправить тому у кого якобы воспроизводите, для локализации проблемы
а что за средства отладки, можно поподробнее?я кроме дебагера ничего не использую
Здравствуйте, reversecode, Вы писали:
R>это можно выяснять только с тем у кого это как вы говорите воспроизводится R>а средства отладки и перформенса по мемори ликам итд вы и сами можете добавить в свой тестовый билд, R>и отправить тому у кого якобы воспроизводите, для локализации проблемы
и проблему саму я локализовал, как только я делаю :
outfile << date_str << logLevel_str << message;
утечка происходит, как комментирую эту строку, утечки нет.
Здравствуйте, arfaa, Вы писали:
A>и проблему саму я локализовал, как только я делаю : A>
A>outfile << date_str << logLevel_str << message;
A>
A>утечка происходит, как комментирую эту строку, утечки нет.
Как проявляется утечка? Программа падает, выжрав всю память?
Откуда берется переменная message?
Есть ли переменные, которые модифицируются в нескольких потоках?
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, arfaa, Вы писали:
A>Здравствуйте, Zhendos, Вы писали:
A>
A>const std::wstring& data = L"111 222 333 444 555 666 777 888 999 000";
A>const std::string message(data.begin(), data.end());
A>
A>дополнил код
Это явно неправильная работа с юникодом "std::string message(data.begin(), data.end())".
Еще у вас все написано в предположении что все всегда хорошо,
что очень плохо если вы запускаете не только на своей машине под присмотром.
Я бы обрабатывал ошибки явно.
И вот это еще:
int indexDelete = servicePath.toStdString().find_last_of('\\');
servicePath.remove(indexDelete + 1, servicePath.size());
Вы взяли перевели servicePath в utf-8 с помощью toStdString,
количество char в utf-8 строке != количеству QChar servicePath в общем случае.
Здравствуйте, arfaa, Вы писали:
A>Здравствуйте, reversecode, Вы писали:
A>а что за средства отладки, можно поподробнее?я кроме дебагера ничего не использую
У gcc/clang есть опция -fsanitize=leak, при запуске скомпилированного
с такими флагами кода включается автоматическая проверка утечек.
Например:
$ cat test.cc
int main()
{
int *a = new int[10];
}
$ g++ -g -fsanitize=leak test.cc
$ ./a.out
=================================================================
==447927==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 40 byte(s) in 1 object(s) allocated from:
#0 0x7f8164f7eb92 in operator new[](unsigned long) /build/gcc/src/gcc/libsanitizer/lsan/lsan_interceptors.cpp:231
#1 0x55a81e14d14a in main /tmp/test.cc:3
#2 0x7f8164a93001 in __libc_start_main (/usr/lib/libc.so.6+0x27001)
SUMMARY: LeakSanitizer: 40 byte(s) leaked in 1 allocation(s).
Прямо пишет строчку в которой произошла утечка,
также есть конечно valgrind.
A>>утечка происходит, как комментирую эту строку, утечки нет.
SVZ>Как проявляется утечка? Программа падает, выжрав всю память? SVZ>Откуда берется переменная message? SVZ>Есть ли переменные, которые модифицируются в нескольких потоках?
1)Программа не падает, а просто выжирает память.
2)message приходит из вне(бесконечный цикл получается message как раз и переходит постоянно в мою функцию)
3)Нет, еще раз,если я буду даже писать:
outfile << "\n";
все равно происходит утечка, при комментировании данного кода, утечки нет!!!!
4)Переменных, модифицирующихся в нескольких потоках нет, есть только один поток
Здравствуйте, XOOIOOX, Вы писали:
XOO>Здравствуйте, arfaa, Вы писали:
A>>все равно происходит утечка, при комментировании данного кода, утечки нет!!!!
XOO>ofstream, как известно, буферизирован. Может ему нужно сделать .flush()?
Спасибо за вариант, попробовал перед close() поставить .flush(), все равно текает.
ОС Windows Server 2016