Russian Qt Forum

Qt => Вопросы новичков => Тема начата: lucky от Февраль 17, 2011, 15:21



Название: Вопрос по освобождению памяти в Qt
Отправлено: 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 за тебя все правильно "почистит".


Название: Re: Вопрос по освобождению памяти в Qt
Отправлено: GreatSnake от Февраль 17, 2011, 15:27
Цитировать
Система удалит автоматически parent и так как child содержит указатель на parent он удалит child тоже автоматом.
parent никто удалять не будет. child будет удален при удалении parent.

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


Название: Re: Вопрос по освобождению памяти в Qt
Отправлено: Пантер от Февраль 17, 2011, 15:29
parent не удалится, его нужно вручную удалять. А вот при его удалении, он грохнет всех своих детей.
То есть: если не назначаешь родителя, удаляй вручную.


Название: Re: Вопрос по освобождению памяти в Qt
Отправлено: lucky от Февраль 17, 2011, 15:31
Спасибо вам большое за пояснение.


Название: Re: Вопрос по освобождению памяти в Qt
Отправлено: GreatSnake от Февраль 17, 2011, 15:32
ремарка: То есть: если не назначаешь родителя и создаёшь объект в куче, удаляй вручную. :)


Название: Re: Вопрос по освобождению памяти в Qt
Отправлено: Igors от Февраль 17, 2011, 15:39
Он пишет что объект pe будет удален автоматически. Объясните пожалуйста, я просто запутался, что и когда удаляется автоматически без вызова оператора delete, а что нужно удалять руками? Просто не привычно как то полагаться что Qt за тебя все правильно "почистит".
В дополнение к тому что уже ответили: случай с postEvent - конкретный/частный, не надо его обобщать. В принципе Qt следует классике "сам создал - сам и почистил". Исключения с parent-child и др. есть и их надо тщательно изучить


Название: Re: Вопрос по освобождению памяти в Qt
Отправлено: GreatSnake от Февраль 17, 2011, 15:44
Цитировать
Исключения с parent-child и др. есть и их надо тщательно изучить
Особенно это касается работы компоновщиков, которые втихую назначают родителей.


Название: Re: Вопрос по освобождению памяти в Qt
Отправлено: lucky от Февраль 17, 2011, 15:46
Код:
Исключения с parent-child и др. есть и их надо тщательно изучить
Ну постепенно буду :) Спасибо всем еще раз за подробное пояснение данного вопроса.