LINUX.ORG.RU

c++ valgrind гонит или что то не так ?

 , ,


0

3
int main () {
    QTextStream out(stdout);
    out.setCodec(QTextCodec::codecForName("UTF-8"));

    QDateTime h = QDateTime::currentDateTime();
    out << h.toString() << "\n";
}

Вроде бы все прозрачно и утечек быть не должно, однако валгринд утверждает что

........
==5470==    by 0x5BCC6E6: ??? (in /usr/lib64/qt4/libQtCore.so.4.8.2)
==5470==    by 0x5B9176E: QLocalePrivate::updateSystemPrivate() (in /usr/lib64/qt4/libQtCore.so.4.8.2)
==5470==    by 0x5B9199A: ??? (in /usr/lib64/qt4/libQtCore.so.4.8.2)
==5470==    by 0x5B92C94: QLocale::system() (in /usr/lib64/qt4/libQtCore.so.4.8.2)
==5470==    by 0x5B7BF61: QDate::shortDayName(int) (in /usr/lib64/qt4/libQtCore.so.4.8.2)
==5470==    by 0x5B7F49A: QDateTime::toString(Qt::DateFormat) const (in /usr/lib64/qt4/libQtCore.so.4.8.2)
==5470==    by 0x4040E3: main (Main.cpp:47)

==5470== LEAK SUMMARY:
==5470==    definitely lost: 192 bytes in 2 blocks
==5470==    indirectly lost: 284 bytes in 6 blocks
==5470==      possibly lost: 0 bytes in 0 blocks
==5470==    still reachable: 61,290 bytes in 61 blocks
==5470==         suppressed: 0 bytes in 0 blocks
==5470== Reachable blocks (those to which a pointer was found) are not shown.
==5470== To see them, rerun with: --leak-check=full --show-reachable=yes
Где 47 строка это
    out << h.toString() << "\n";
Но ведь то что возвращается из toString - есть временный объект и должен уничтожиться после вычисления выражения (не помню где но было в стандарте). Что не так ?

Насколько я помню, у Qt есть набор правил для valgrind'a, чтоб тот «шумел» меньше. Вот только забыл, как это называется...

metawishmaster ★★★ ()
Ответ на: комментарий от queen3

Дак выходит валгриндушка не такой уж нуиверсальный и сильно шумит ? Вообще странно как такое может быть, стандарт крестов же английским по белому пишет что не может этого быть.

s9gf4ult ★★ ()
Ответ на: комментарий от queen3

Вместо того, чтобы чинить Qt, нокия затыкает рот валгринду?

O02eg ★★★★★ ()
Ответ на: комментарий от slackwarrior

Спецификация функции toString говорит что возвращает она QString - то есть объект, не указатель и даже не ссылку (хотя ссылка имеет семантику объекта) а именно объект через стек, так что течь в принципе не может ничего, только если QString при уничтожении не освобождает память выделенную под строку (указатель на которую лежит в самом QString), но это не так, ибо такой код

int main () {
  QTextStream out(stdout);
  out.setCodec(QTextCodec::codecForName("UTF-8"));
  QString a("mazafaka");
  out << a << "\n";
  out.flush();
};

s9gf4ult ★★ ()
Ответ на: комментарий от s9gf4ult

течь в принципе не может ничего

Товарищ верь! Супрессь валгринд :)

slackwarrior ★★★★★ ()
Ответ на: комментарий от ratvier

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

s9gf4ult ★★ ()
Ответ на: комментарий от s9gf4ult

Сделай раз 10 этот out << h.toString() << «\n»;
Если в логе валгринда будет «in 1 blocks» - это скорее всего какой-то глобальный объект не разрушается

ratvier ()
Ответ на: комментарий от s9gf4ult

Это не valgrind, он честно сообщает что видит. Но реализации либ бывают разные... Например, OCI (Oracle Client) выдаёт просто туеву хучу ошибок.

В данном же случае утечка внутри QLocalePrivate::updateSystemPrivate(), а не в момент вызова в стеке, при чём тут C++? А там может быть всё, что угодно. См. исходники Qt, если уж так интересно.

queen3 ★★★★★ ()

Всё OK.

$ g++ --version
g++ (Debian 4.6.3-1) 4.6.3
$ qmake --version
QMake version 2.01a
Using Qt version 4.8.1 in /usr/lib/i386-linux-gnu
$ valgrind --leak-check=full ./qt_tostring_valgrind
==19039== Memcheck, a memory error detector
==19039== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==19039== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==19039== Command: ./qt_tostring_valgrind
==19039== 
Text
==19039== 
==19039== HEAP SUMMARY:
==19039==     in use at exit: 940 bytes in 11 blocks
==19039==   total heap usage: 129 allocs, 118 frees, 38,355 bytes allocated
==19039== 
==19039== LEAK SUMMARY:
==19039==    definitely lost: 0 bytes in 0 blocks
==19039==    indirectly lost: 0 bytes in 0 blocks
==19039==      possibly lost: 0 bytes in 0 blocks
==19039==    still reachable: 940 bytes in 11 blocks
==19039==         suppressed: 0 bytes in 0 blocks
==19039== Reachable blocks (those to which a pointer was found) are not shown.
==19039== To see them, rerun with: --leak-check=full --show-reachable=yes
==19039== 
==19039== For counts of detected and suppressed errors, rerun with: -v
==19039== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 67 from 6)

gag ★★★★★ ()
Ответ на: комментарий от gag

Версия qt дистр собирал / не собирал отладочную информацию для QT ?

s9gf4ult ★★ ()
Ответ на: комментарий от s9gf4ult

Версия qt дистр

см. внимательно выше

собирал / не собирал отладочную информацию для QT ?

Нет, не устанавливал libqt4-dbg. Если нет необходимости отладки qt, то valgrind'у это не нужно (добавляются только номера строк в исходниках qt).

gag ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.