Russian Qt Forum
Ноябрь 26, 2024, 01:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: и опять про мемори лик  (Прочитано 13285 раз)
qt_newer
Гость
« : Август 14, 2014, 15:09 »

У меня написан интерфейс программы (он же прототип), в нем порядка 25 классов, все включают Q_OBJECT и наследуются от QWidget или его разновидностей (QValidator в том числе). Ни одного delete в коде нет, также как нет дилитов в многочисленных примерах QT 5.3. Когда надо использовать delete Непонимающий Как проверить, что в коде нет утечек памяти? В Qt Creator есть встроенный анализатор памяти, но при попытке его использования получаю:
Analyzing memory of C:\xxx\build-bc-Desktop_Qt_5_3_MinGW_32bit-Debug\debug\myApp.exe
Error: "valgrind" could not be started: No private key file given.
Analyzing finished.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #1 : Август 14, 2014, 16:55 »

1. valgrind не встроена в QtCreator, это внешняя(отдельная) программа. QtCreator обеспечивает ее запуск (если есть что запускать).
2. QObject и все его наследники при удалении удаляет все свои дочернии обьекты.
Записан
Bepec
Гость
« Ответ #2 : Август 14, 2014, 17:21 »

Прогони через cppCheck/ valgrind. Если не поможет, то просмотр кода и анализ Улыбающийся
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #3 : Август 14, 2014, 21:59 »

Под виндой valgrind не работает, поздравляю. Можно использовать платные штуки типа AQTime.
Записан

Гугль в помощь
vizir.vs
Гость
« Ответ #4 : Август 15, 2014, 11:16 »

AddressSanitizer или Dr. Memory. Вот здесь видео о том как работает AddressSanitizer (https://tech.yandex.ru/events/science-seminars/Serebryanyi-30apr/talks/927/)
Записан
qt_newer
Гость
« Ответ #5 : Август 19, 2014, 15:56 »

Спасибо за советы! Вот, результат Dr Memory (точнее та часть, в кот. хотя бы, понятно проблемное место) :

~~Dr.M~~ Error #1: LEAK 80 direct bytes 0x15a30920-0x15a30970 + 0 indirect bytes
~~Dr.M~~ # 0 replace_operator_new                                        [d:\drmemory_package\common\alloc_replace.c:2449]
~~Dr.M~~ # 1 Qt5Guid.dll!QExplicitlySharedDataPointer<>::clone           [../../include/QtCore/../../src/corelib/tools/qshareddata.h:240]
~~Dr.M~~ # 2 Qt5Guid.dll!QExplicitlySharedDataPointer<>::detach_helper   [../../include/QtCore/../../src/corelib/tools/qshareddata.h:246]
~~Dr.M~~ # 3 Qt5Guid.dll!QExplicitlySharedDataPointer<>::detach          [../../include/QtCore/../../src/corelib/tools/qshareddata.h:145]
~~Dr.M~~ # 4 Qt5Guid.dll!QFont::detach                                   [text/qfont.cpp:661]
~~Dr.M~~ # 5 Qt5Guid.dll!QFont::setPointSize                             [text/qfont.cpp:968]
~~Dr.M~~ # 6 MainWindow::createTitle                                     [../myApp/mainwindow.cpp:227]
~~Dr.M~~ # 7 MainWindow::MainWindow                                      [../myApp/mainwindow.cpp:50]
~~Dr.M~~ # 8 main

код:
    QFont font = title->font();
    font.setPointSize(font.pointSize()*1.8 ) ;
    title->setFont(font);

~~Dr.M~~ Error #5: LEAK 184 direct bytes 0x15a64408-0x15a644c0 + 219 indirect bytes
~~Dr.M~~ # 0 replace_operator_new                 [d:\drmemory_package\common\alloc_replace.c:2449]
~~Dr.M~~ # 1 Qt5Cored.dll!QFile::QFile            [c:\work\build\qt5_workdir\w\s\qtbase\src\corelib/io/qfile.cpp:253]
~~Dr.M~~ # 2 MainWindow::MainWindow               [../myApp/mainwindow.cpp:38]
~~Dr.M~~ # 3 main 

код:
    QFile file(":/qss/origin.qss");
    file.open(QFile::ReadOnly);
    QString styleSheet = QLatin1String(file.readAll());
    setStyleSheet(styleSheet);
    file.close();

И что с ним не так? 1й кусок кода (с фонтом)  скопирован из примера кьют калькулятор- нет там никакого дилита  Непонимающий
Записан
vizir.vs
Гость
« Ответ #6 : Август 20, 2014, 09:43 »

у Qt свой менеджер памяти, поэтому dr. Memory и Valgrind часто необоснованно ругаются на утечку памяти. http://ubuntuforums.org/showthread.php?t=896913
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #7 : Август 20, 2014, 10:19 »

у Qt свой менеджер памяти, поэтому dr. Memory и Valgrind часто необоснованно ругаются на утечку памяти. http://ubuntuforums.org/showthread.php?t=896913
Первый раз об этом слышу. Если бы был свой менеджер памяти, valgrind бы ничего не показывал, так как он перехватывает функции malloc, free.

Ну может в каких-то редких случаях используются свои аллокаторы. Но valgrind, по идее, их должен вообще не видеть.

Вероятно в Qt текут синглтоны, т.к. на освобождение их памяти можно забить.
Записан

Гугль в помощь
vizir.vs
Гость
« Ответ #8 : Август 20, 2014, 11:21 »

у Qt свой менеджер памяти, поэтому dr. Memory и Valgrind часто необоснованно ругаются на утечку памяти. http://ubuntuforums.org/showthread.php?t=896913
Первый раз об этом слышу. Если бы был свой менеджер памяти, valgrind бы ничего не показывал, так как он перехватывает функции malloc, free.

Ну может в каких-то редких случаях используются свои аллокаторы. Но valgrind, по идее, их должен вообще не видеть.

Вероятно в Qt текут синглтоны, т.к. на освобождение их памяти можно забить.

Вот здесь http://developer.nokia.com/community/wiki/Using_valgrind_with_Qt_Creator написано, что не надо обращать внимание на ошибки в glibc или Qt. Сайт нокиевский, можно доверять тому, что там написано. Там так же сказано, что при использовании валгринда можно использовать "suppression files", который позволяет убрать из вывода ложные срабатывания. Про dr. memory я подобного не нашел, но думаю что дела там обстоят так же.
« Последнее редактирование: Август 20, 2014, 11:24 от vizir.vs » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 20, 2014, 11:25 »

у Qt свой менеджер памяти, поэтому...
Непонимающий Тоже никогда об этом не слыхал. Поясните что имелось ввиду

Вот здесь http://developer.nokia.com/community/wiki/Using_valgrind_with_Qt_Creator написано, что не надо обращать внимание на ошибки в glibc или Qt. Сайт нокиевский, можно доверять тому, что там написано.
Ну а "свой менеджер" тут причем? Про него там ничего не увидел

На OSX с valgrind неважно (на большом проекте тормоза невыносимы), зато есть прекрасный Leaks (Instruments)
« Последнее редактирование: Август 20, 2014, 11:27 от Igors » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Август 20, 2014, 11:41 »

Для валгринда есть фильтры, которые отключают показ утечек в Кьюте.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vizir.vs
Гость
« Ответ #11 : Август 20, 2014, 13:15 »

у Qt свой менеджер памяти, поэтому...
Непонимающий Тоже никогда об этом не слыхал. Поясните что имелось ввиду

Вот здесь http://developer.nokia.com/community/wiki/Using_valgrind_with_Qt_Creator написано, что не надо обращать внимание на ошибки в glibc или Qt. Сайт нокиевский, можно доверять тому, что там написано.
Ну а "свой менеджер" тут причем? Про него там ничего не увидел

На OSX с valgrind неважно (на большом проекте тормоза невыносимы), зато есть прекрасный Leaks (Instruments)

Здесь (сайт нокии) ни чего про менеджер памяти не говориться, а говориться на форуме. Сам про менеджер Qt не слышал/сталкивался. Знаю что в Qt батя за своими детьми сам следит и сам, когда надо, их удаляет.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Август 20, 2014, 13:17 »

и где там про менеджер памяти написано?
Знаю что в Qt батя за своими детьми сам следит и сам, когда надо, их удаляет.
вот об этом там и идет речь
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
vizir.vs
Гость
« Ответ #13 : Август 20, 2014, 14:02 »

и где там про менеджер памяти написано?
Знаю что в Qt батя за своими детьми сам следит и сам, когда надо, их удаляет.
вот об этом там и идет речь
Цитата с форума:
"Valgrind results are usually wrong when you are testing a program that uses QT (and GTK too), because the way that QT manages the memory."
Записан
Bepec
Гость
« Ответ #14 : Август 20, 2014, 14:03 »

Хватит толочь воду в ступе. Valgrind не может правильно оценить утечки в Qt без дополнительных телодвижений.
И да, менеджер памяти в Qt есть, упрощенный - так называемая система родительского контроля Веселый
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 22.