утечка памяти при записи в файл в потоке
От: arfaa  
Дата: 25.05.20 14:23
Оценка:
Добрый день, есть поток, бесконечный(он же сервис), в котором постоянно происходит запись в файл и вот при записи в файл происходит утечка памяти, не могу понять почему, может кто скажет, вот исходный код:
void functionInThread()
{
    std::vector<wchar_t> pathBuf;
        DWORD copied = 0;
        pathBuf.resize(pathBuf.size() + MAX_PATH);
        copied = GetModuleFileName(0, &pathBuf.at(0), pathBuf.size());
        QString servicePath;
        for (int i = 0; i < pathBuf.size(); i++)
        {
            if (pathBuf.at(i) == L'\0')
                break;
            servicePath.append(pathBuf.at(i));
        }
        int indexDelete = servicePath.toStdString().find_last_of('\\');
        servicePath.remove(indexDelete + 1, servicePath.size());
        QString _filePath = servicePath;
        //std::ofstream outfile;
        QString applogPath = _filePath + "AppLog.txt";
        //outfile.open(applogPath.toStdString(), std::ios_base::app); // append instead of overwrite

        boost::posix_time::ptime timeLocal = boost::posix_time::second_clock::local_time();
        std::string date_str = "[ " + std::to_string(timeLocal.time_of_day().hours()) + ":" + std::to_string(timeLocal.time_of_day().minutes()) + ":" + std::to_string(timeLocal.time_of_day().seconds()) + " " +
            std::to_string(timeLocal.date().day()) + "-" + std::to_string(timeLocal.date().month()) + "-" + std::to_string(timeLocal.date().year()) + " ] ";

        std::string logLevel_str = " [!!!] ";

        QFile file(applogPath);
        if (file.open(QFile::Append))
        {
            QTextStream out(&file);
            out << date_str.c_str() << message.c_str() <<'\n';
        }
        file.close();

        //outfile << date_str << logLevel_str << message;
        //outfile << "\n";
        //outfile.close();
}


как видно в коде, пробовал и через QFile и через std::ofstream, если закомментировать строку ввода в поток :
out << date_str.c_str() << message.c_str() <<'\n';
или 
outfile << date_str << logLevel_str << message;

то утечки нет, почему так происходит и как с этим бороться?
Отредактировано 25.05.2020 14:24 arfaa . Предыдущая версия .
Re: утечка памяти при записи в файл в потоке
От: Zhendos  
Дата: 25.05.20 14:36
Оценка:
Здравствуйте, arfaa, Вы писали:

A>Добрый день, есть поток, бесконечный(он же сервис), в котором постоянно происходит запись в файл и вот при записи в файл происходит утечка памяти, не могу понять почему, может кто скажет, вот исходный код:



A>как видно в коде, пробовал и через QFile и через std::ofstream, если закомментировать строку ввода в поток :

A>
A>out << date_str.c_str() << message.c_str() <<'\n';
A>или 
A>outfile << date_str << logLevel_str << message;
A>

A>то утечки нет, почему так происходит и как с этим бороться?

в вашем коде нет создания и типа message,
а телепаты как всегда где-то там, но не здесь.
И если используете инструмент для анализа утечек,
почему он не сообщает какая память и где именно утекает?
Re[2]: утечка памяти при записи в файл в потоке
От: arfaa  
Дата: 25.05.20 14:47
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, arfaa, Вы писали:


A>>Добрый день, есть поток, бесконечный(он же сервис), в котором постоянно происходит запись в файл и вот при записи в файл происходит утечка памяти, не могу понять почему, может кто скажет, вот исходный код:



A>>как видно в коде, пробовал и через QFile и через std::ofstream, если закомментировать строку ввода в поток :

A>>
A>>out << date_str.c_str() << message.c_str() <<'\n';
A>>или 
A>>outfile << date_str << logLevel_str << message;
A>>

A>>то утечки нет, почему так происходит и как с этим бороться?

Z>в вашем коде нет создания и типа message,

Z>а телепаты как всегда где-то там, но не здесь.
Z>И если используете инструмент для анализа утечек,
Z>почему он не сообщает какая память и где именно утекает?

const std::wstring& data = L"111 222 333 444 555 666 777 888 999 000";
const std::string message(data.begin(), data.end());

дополнил код
Re: утечка памяти при записи в файл в потоке
От: reversecode google
Дата: 25.05.20 15:10
Оценка:
а что дебагеры и прочие средства поиска утечек уже не в моде ?
Re[2]: утечка памяти при записи в файл в потоке
От: arfaa  
Дата: 25.05.20 15:48
Оценка:
Здравствуйте, reversecode, Вы писали:

R>а что дебагеры и прочие средства поиска утечек уже не в моде ?

на моем компьютере утечка не воспроизводится, воспроизводится на другом компьютере, где ни студии ничего нет, поэтому и спрашиваю, реальна ли такая утечка ? или это какой-то глюк?
Re[3]: утечка памяти при записи в файл в потоке
От: reversecode google
Дата: 25.05.20 15:51
Оценка:
это можно выяснять только с тем у кого это как вы говорите воспроизводится
а средства отладки и перформенса по мемори ликам итд вы и сами можете добавить в свой тестовый билд,
и отправить тому у кого якобы воспроизводите, для локализации проблемы
Re[4]: утечка памяти при записи в файл в потоке
От: arfaa  
Дата: 26.05.20 07:45
Оценка:
Здравствуйте, reversecode, Вы писали:

R>это можно выяснять только с тем у кого это как вы говорите воспроизводится

R>а средства отладки и перформенса по мемори ликам итд вы и сами можете добавить в свой тестовый билд,
R>и отправить тому у кого якобы воспроизводите, для локализации проблемы
а что за средства отладки, можно поподробнее?я кроме дебагера ничего не использую
Re[4]: утечка памяти при записи в файл в потоке
От: arfaa  
Дата: 26.05.20 08:52
Оценка:
Здравствуйте, reversecode, Вы писали:

R>это можно выяснять только с тем у кого это как вы говорите воспроизводится

R>а средства отладки и перформенса по мемори ликам итд вы и сами можете добавить в свой тестовый билд,
R>и отправить тому у кого якобы воспроизводите, для локализации проблемы
и проблему саму я локализовал, как только я делаю :
outfile << date_str << logLevel_str << message;

утечка происходит, как комментирую эту строку, утечки нет.
Re[5]: утечка памяти при записи в файл в потоке
От: Stanislav V. Zudin Россия  
Дата: 26.05.20 09:00
Оценка:
Здравствуйте, arfaa, Вы писали:

A>и проблему саму я локализовал, как только я делаю :

A>
A>outfile << date_str << logLevel_str << message;
A>

A>утечка происходит, как комментирую эту строку, утечки нет.

Как проявляется утечка? Программа падает, выжрав всю память?
Откуда берется переменная message?
Есть ли переменные, которые модифицируются в нескольких потоках?
_____________________
С уважением,
Stanislav V. Zudin
Re[3]: утечка памяти при записи в файл в потоке
От: Zhendos  
Дата: 26.05.20 09:32
Оценка:
Здравствуйте, 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 в общем случае.

Например:
 QString s("Козел");
  std::cout << "QString.length() " << s.length() << " "
            << "std::string.length() " << s.toStdString().size()
            << "\n";


выведет 5 и 10. Не знаю обрабатывает ли QString::remove выход за пределы.
Re[5]: утечка памяти при записи в файл в потоке
От: Zhendos  
Дата: 26.05.20 09:37
Оценка:
Здравствуйте, 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.
Re[6]: утечка памяти при записи в файл в потоке
От: arfaa  
Дата: 26.05.20 09:45
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, arfaa, Вы писали:


A>>и проблему саму я локализовал, как только я делаю :

A>>
A>>outfile << date_str << logLevel_str << message;
A>>

A>>утечка происходит, как комментирую эту строку, утечки нет.

SVZ>Как проявляется утечка? Программа падает, выжрав всю память?

SVZ>Откуда берется переменная message?
SVZ>Есть ли переменные, которые модифицируются в нескольких потоках?
1)Программа не падает, а просто выжирает память.
2)message приходит из вне(бесконечный цикл получается message как раз и переходит постоянно в мою функцию)
3)Нет, еще раз,если я буду даже писать:
outfile << "\n";

все равно происходит утечка, при комментировании данного кода, утечки нет!!!!
4)Переменных, модифицирующихся в нескольких потоках нет, есть только один поток
Re[7]: утечка памяти при записи в файл в потоке
От: XOOIOOX  
Дата: 26.05.20 11:55
Оценка:
Здравствуйте, arfaa, Вы писали:

A>все равно происходит утечка, при комментировании данного кода, утечки нет!!!!


ofstream, как известно, буферизирован. Может ему нужно сделать .flush()?
Re[8]: утечка памяти при записи в файл в потоке
От: arfaa  
Дата: 26.05.20 12:00
Оценка:
Здравствуйте, XOOIOOX, Вы писали:

XOO>Здравствуйте, arfaa, Вы писали:


A>>все равно происходит утечка, при комментировании данного кода, утечки нет!!!!


XOO>ofstream, как известно, буферизирован. Может ему нужно сделать .flush()?

Спасибо за вариант, попробовал перед close() поставить .flush(), все равно текает.
ОС Windows Server 2016
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.