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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по освобождению памяти в Qt  (Прочитано 6294 раз)
lucky
Гость
« : Февраль 17, 2011, 15:21 »

Если честно по данному вопросу толкового и полного ответа не нашел (может плохо искал). Как я понял при таком раскладе:
Код:
QObject* parent = new QObject;
QObject* child = new QObject(parent);

Система удалит автоматически parent и так как child содержит указатель на parent он удалит child тоже автоматом.
Но в Шлее вчера вычитал вот такое (тема про потоки):
Код:
    void run()
    {
        for (int i = 0; i <= 100; ++i) {
            usleep(100000);       

            ProgressEvent* pe = new ProgressEvent;
            pe->setValue(i);
            QApplication::postEvent(m_pobjReceiver, pe);
        }
    }
Он пишет что объект pe будет удален автоматически. Объясните пожалуйста, я просто запутался, что и когда удаляется автоматически без вызова оператора delete, а что нужно удалять руками? Просто не привычно как то полагаться что Qt за тебя все правильно "почистит".
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Февраль 17, 2011, 15:27 »

Цитировать
Система удалит автоматически parent и так как child содержит указатель на parent он удалит child тоже автоматом.
parent никто удалять не будет. child будет удален при удалении parent.

Цитировать
Он пишет что объект pe будет удален автоматически.
Именно так, т.к. так ведёт себя QApplication::postEvent().
Записан

Qt 5.11/4.8.7 (X11/Win)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #2 : Февраль 17, 2011, 15:29 »

parent не удалится, его нужно вручную удалять. А вот при его удалении, он грохнет всех своих детей.
То есть: если не назначаешь родителя, удаляй вручную.
Записан

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

Спасибо вам большое за пояснение.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Февраль 17, 2011, 15:32 »

ремарка: То есть: если не назначаешь родителя и создаёшь объект в куче, удаляй вручную. Улыбающийся
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Февраль 17, 2011, 15:39 »

Он пишет что объект pe будет удален автоматически. Объясните пожалуйста, я просто запутался, что и когда удаляется автоматически без вызова оператора delete, а что нужно удалять руками? Просто не привычно как то полагаться что Qt за тебя все правильно "почистит".
В дополнение к тому что уже ответили: случай с postEvent - конкретный/частный, не надо его обобщать. В принципе Qt следует классике "сам создал - сам и почистил". Исключения с parent-child и др. есть и их надо тщательно изучить
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Февраль 17, 2011, 15:44 »

Цитировать
Исключения с parent-child и др. есть и их надо тщательно изучить
Особенно это касается работы компоновщиков, которые втихую назначают родителей.
Записан

Qt 5.11/4.8.7 (X11/Win)
lucky
Гость
« Ответ #7 : Февраль 17, 2011, 15:46 »

Код:
Исключения с parent-child и др. есть и их надо тщательно изучить
Ну постепенно буду Улыбающийся Спасибо всем еще раз за подробное пояснение данного вопроса.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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