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

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

Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: QObject и memory leaks  (Прочитано 36516 раз)
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #15 : Август 26, 2010, 02:11 »

на линукс используют valgrind
Записан
eugene
Гость
« Ответ #16 : Август 26, 2010, 07:16 »

Проверил на винде, память смотрел вручную через PE
Код:
    while(getchar()){
        printf("Create\n");
        QObject* obj1 = new QObject;
        QObject* obj2 = new QObject;
        QObject* obj3 = new QObject;
        QObject* obj4 = new QObject;
        printf("Delete\n");

        delete obj1;
        delete obj2;
        delete obj3;
        delete obj4;
    }
После первого прохода по циклу память замирает и больше не меняется
Записан
Sancho_s_rancho
Гость
« Ответ #17 : Август 26, 2010, 07:32 »

Цитата: Sancho_s_rancho от Август 25, 2010,  20:18
Меня тоже это потрясло. Искать утечки памяти в языке и библиотеке, с которыми НЕ знаком. Вообще.

Вас это будет потрясать до тех пор, пока Вы не осознаете разницу между указателем на константу и константным указателем.
Константная ссылка - это константный указатель на константу. Я был невнимателен и не заметил. что в векторе лежат указатели. Понятно, что указатель мы не трогаем. Извините, я был невнимателен и НЕ прав.
Вместо удаления указателей в цикле можно просто сделать qDeleteAll(const Container & c).
По поводу утечек памяти: насколько я вижу никаких утечек нет. Скорее всего или утилита врет или Qt внутри выделив память однажды держит ее прозапас чтобы уменьшить кол-во операций выделения/освобождения.
Записан
sq_vasya
Гость
« Ответ #18 : Август 26, 2010, 10:54 »

А какие результаты даёт выполнение функции несколько раз?

Очень хорошее замечание. Да, с увеличением количества создаваемых элементов размеры убегаемой памяти не изменяются. Из этого я делаю заключение, что это заслуга некой внутренней оптимизации самой Qt. Вопрос. Можно ли это каким-то образом отключить? Чтобы всё работало по честному?
Предваряя коментарии в духе, раз не течёт, то и проблемы нет, забей и не парься, хочу напомнить, что это вырожденный случай большой проблемы. В данный момент я занят поиском утечек памяти в большом проекте написаным не мной. Плюс к этому у меня нет опыта работы с Qt. В проекте достаточно много утечек и я хочу чётко понимать, что и где течёт, чтобы разработать стратегию пофикса и потом планомерно и безболезненно её внедрить в существующий проект с как можно меньшим колличеством головняка.

После первого прохода по циклу память замирает и больше не меняется

Да, из той же серии.
Записан
sq_vasya
Гость
« Ответ #19 : Август 26, 2010, 11:06 »

Извините, я был невнимателен и НЕ прав.

Ничего страшного. Всегда рад помочь.
Записан
BRE
Гость
« Ответ #20 : Август 26, 2010, 11:17 »

sq_vasya, а попробуй такой код:
Код
C++ (Qt)
void JustDoIt()
   {
   QObject* obj1 = new QObject;
   QObject* obj2 = new QObject;
   QObject* obj3 = new QTimer;
   QObject* obj4 = new QTimer;
 
   delete obj1;
   delete obj2;
   delete obj3;
   delete obj4;
   }
 
Сколько покажет leaks?

Думается мне это объект QMetaObject остается.
« Последнее редактирование: Август 26, 2010, 12:05 от BRE » Записан
sq_vasya
Гость
« Ответ #21 : Август 26, 2010, 11:34 »

sq_vasya, а попробуй такой код:
Код
C++ (Qt)
void JustDoIt()
   {
   QObject* obj1 = new QObject;
   QObject* obj2 = new QObject;
   QObject* obj3 = new QTimer;
   QObject* obj4 = new QTimer;
 
   delete obj1;
   delete obj2;
   delete obj3;
   delete obj4;
   }
 
Сколько покажет leaks?

"8 memory leaks detected"

По ходу, что бы не создавать, если оно унаследовано от QObject - будет такое поведение.

Цитировать
Думается мне это объект QMetaObject остается.
Я могу как-то повлиять на его существование?
Записан
BRE
Гость
« Ответ #22 : Август 26, 2010, 11:42 »

Цитировать
Думается мне это объект QMetaObject остается.
Я могу как-то повлиять на его существование?
Ну, это только предположение...
Насчет повлиять, то нет. В Qt очень многое завязано на Meta-object system.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Август 26, 2010, 11:45 »

Предваряя коментарии в духе, раз не течёт, то и проблемы нет, забей и не парься, хочу напомнить, что ...
Резвый старт типа "У меня утечек не будет!" наблюдался не раз и не два на этом форуме. Вот только я ни разу не видел успешного финиша  Улыбающийся Редко но иногда удается доказать что да, течет (особенно в UI). Еще реже удается найти причину. Ну и дальше-то что? Переделывать недра Qt? Это накладно хотя бы потому что нужна статическая сборка + надо чего-то доказывать с лицензированием + заботы с каждой новой версией Qt.

То что с утечками/непонятками приходится мириться задевает Ваше самолюбие - нормально! (мое тоже). Я не призываю наплевать на все утечки. Но более практично сосредоточиться на отлове утечек по вине самой программы и не ставить задачу типа "мой список утечек пуст" - это может оказаться недостижимо практически.

Записан
JamS007
Гость
« Ответ #24 : Август 26, 2010, 12:20 »

А тема то интересная... это что же получается, если выделить QObject динамически, то сразу две дырки открываются?
Код:
void JustDoIt()
    {
    QObject* obj1 = new QObject;
    QObject* obj2 = new QObject;
    QObject* obj3 = new QTimer;
    QObject* obj4 = new QTimer;
 
    delete obj1;
    delete obj2;
    delete obj3;
    delete obj4;
    }

Цитировать
"8 memory leaks detected"

Судя по коду - да. Кто-то знающий valgrind может это подтвердить? Или может это связано только с Symbian, напомню, ее поддержку добавили недавно, может тролли сами чего намудрили?

У меня еще возникает мысль, что этот метаобъект должен удалиться в следующем витке exec(), может такое быть?
Записан
BRE
Гость
« Ответ #25 : Август 26, 2010, 12:37 »

Скорее всего это не утечка/дырка. Дальнейшей утечки памяти не происходит.
Скорее всего, при первом создании объекта, создается какой-то глобальный объект. Только пока не понятно какой.  Улыбающийся
Я предположил, что это объект QMetaObject, но смотрю исходники и склоняюсь, что это не он.
Теперь думается мне...  Улыбающийся что это при создании первого объекта QObject, создается глобальный пул мьютексов (QMutexPool).
« Последнее редактирование: Август 26, 2010, 12:52 от BRE » Записан
JamS007
Гость
« Ответ #26 : Август 26, 2010, 12:56 »

Вот реакция valgrind на этот код:

Цитировать
LEAK SUMMARY:
==2141==    definitely lost: 0 bytes in 0 blocks
==2141==    indirectly lost: 0 bytes in 0 blocks
==2141==      possibly lost: 3,136 bytes in 29 blocks
==2141==    still reachable: 7,830 bytes in 115 blocks
==2141==         suppressed: 0 bytes in 0 blocks
==2141==
==2141== ERROR SUMMARY: 18 errors from 18 contexts (suppressed: 35 from 10)

Видимых утечек он не находит, но предполагает что они есть.
Кто может мне объяснить последнюю строку?
Записан
sq_vasya
Гость
« Ответ #27 : Август 26, 2010, 13:12 »

Предваряя коментарии в духе, раз не течёт, то и проблемы нет, забей и не парься, хочу напомнить, что ...
Резвый старт типа "У меня утечек не будет!" наблюдался не раз и не два на этом форуме. Вот только я ни разу не видел успешного финиша  Улыбающийся Редко но иногда удается доказать что да, течет (особенно в UI). Еще реже удается найти причину. Ну и дальше-то что? Переделывать недра Qt? Это накладно хотя бы потому что нужна статическая сборка + надо чего-то доказывать с лицензированием + заботы с каждой новой версией Qt.

То что с утечками/непонятками приходится мириться задевает Ваше самолюбие - нормально! (мое тоже). Я не призываю наплевать на все утечки. Но более практично сосредоточиться на отлове утечек по вине самой программы и не ставить задачу типа "мой список утечек пуст" - это может оказаться недостижимо практически.

Нет, я конечно в некотором смысле альтруист, но не до такой же степени, чтобы фиксить лики в самой Qt (хотя чисто гипотетически, таковая необходимость может возникнуть, но вероятность её возникновения ничтожно мала). Я очень надеюсь, что мне не придётся фиксить Qt. Оно мне сто лет не нужно, для этих целей нокиа держит штат специально обученных людей, вот пусть они и развлекаются, мне же этим заниматься недосуг.
Уточняю суть проблемы. Я не стремлюсь к полному отсутствию ликов. Просто в какой-то момент резко встала проблема, что приложение после пяти минут работы падает, поскольку заканчивается память на девайсе и система просто забивает жадное приложение, дабы не повадно было. Стали трейсить - нашли два с половиной ведра ликов, но я никак не могу толком разобраться, что же именно течёт, поскольку наши родные лики перемешаны с ликами самой Qt и, когда пытаешься сделать простенький пример, и локализовать лик очень хочется чётко понимать мой это лик или лик библиотеки. Мы уже давно смирились, что библиотека подтекает, но пришли к выводу, что она это делает не настолько сильно, чтобы создавать нам проблемы. Просто хочется отмежеваться от неё.

А тема то интересная...
Цитировать
"8 memory leaks detected"
Хочу отметить, что больше чем 258 ликов на подобном коде я не видел. Пробовал создавать хоть 300, хоть 3000, хоть 30000 объектов. Я так понимаю, что это некая внутрення то ли оптимизация, то ли трик, просто мне это мешает.
Записан
BRE
Гость
« Ответ #28 : Август 26, 2010, 13:20 »

Я так понимаю, что это некая внутрення то ли оптимизация, то ли трик, просто мне это мешает.
IMHO, понимаю что мешает, только вряд-ли что-то можно будет сделать.
Qt активно использует глобальные объекты (sigletons), которые могут создаваться в любой момент.
Записан
sq_vasya
Гость
« Ответ #29 : Август 26, 2010, 13:36 »

И ещё на тему альтруизма. Если писать нативное приложения для Symbian, то очень даже не сложно писать его без ликов. Вообще. Ни единого. Отчасти это обусловлено тем фактом, что многие системные вещи происходят в системных сервисах (серверах в терминах Symbian). Отчасти тем, что платформа достаточно хорошо спроектирована и протестирована (по крайней мере до версии 9.2 ИМХО). Зато на симбиане своих приколов хватает )) Понимаю, что на других платформах всё по другому и есть свои сильные и слабые стороны. Ну, это я так. Just note.
Записан
Страниц: 1 [2] 3 4 5   Вверх
  Печать  
 
Перейти в:  


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