Russian Qt Forum

Qt => Вопросы новичков => Тема начата: pretender424 от Февраль 11, 2011, 13:37



Название: Порядок создания объектов
Отправлено: pretender424 от Февраль 11, 2011, 13:37
Здравствуйте, друзья...

Тщетно пытаюсь понять вот это:

Код:
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

// It doesn't work:
    QVBoxLayout layout;
    QWidget widget;
    widget.setLayout(&layout);   
    widget.show();

// It works:
//    QWidget widget;
//    QVBoxLayout layout;
//    widget.setLayout(&layout);   
//    widget.show();

// It works:
//    QWidget *widget = new QWidget;
//    QVBoxLayout *layout = new QVBoxLayout;
//    widget->setLayout(layout);   
//    widget->show();

// It works:
//    QVBoxLayout *layout = new QVBoxLayout;
//    QWidget *widget = new QWidget;
//    widget->setLayout(layout);   
//    widget->show();

    return app.exec();
}

При закрытии окна получаю вот это:
*** glibc detected *** ./question: free(): invalid pointer: 0xbfc0066c ***

Где-то память освобождается дважды, а где и почему не хватает знаний/опыта/мозга.

Ткните носом, пожалуйста...  :-\


Название: Re: Порядок создания объектов
Отправлено: ilyagoo от Февраль 11, 2011, 13:47
assistant говорит
void QWidget::setLayout ( QLayout * layout )
The QWidget will take ownership of layout

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


Название: Re: Порядок создания объектов
Отправлено: Пантер от Февраль 11, 2011, 13:54
Т.е. при разворачивании стека сначала убивается виджет, который грохает своих детей (в данном случае лайот), а потом грохается лайот (который уже грохнут).


Название: Re: Порядок создания объектов
Отправлено: ilyagoo от Февраль 11, 2011, 13:59
а в первом рабочем варианте этого не происходит, т.к. лэйаут умирает первым и удаляет себя из родителя.


Название: Re: Порядок создания объектов
Отправлено: pretender424 от Февраль 11, 2011, 14:19
В очередной раз проблема в RTFM  :)

Спасибо, друзья. Все понятно с этим...



Название: Re: Порядок создания объектов
Отправлено: GreatSnake от Февраль 11, 2011, 14:42
4-й вариант ничем не отличается от 3-го  :)


Название: Re: Порядок создания объектов
Отправлено: pretender424 от Февраль 11, 2011, 17:01
Это из-за умных указателей?


Название: Re: Порядок создания объектов
Отправлено: GreatSnake от Февраль 11, 2011, 17:09
Цитировать
Это из-за умных указателей?
Да нет, причём здесь умные указатели? Да и где вы их видите?
Просто порядок создания ни от кого независящих объектов в куче не имеет значения.


Название: Re: Порядок создания объектов
Отправлено: Fat-Zer от Февраль 11, 2011, 18:15
Это из-за умных указателей?
скорей как раз потому, что такие не применяются ;)


Название: Re: Порядок создания объектов
Отправлено: pretender424 от Февраль 11, 2011, 18:17
А вот в последнем четверостишии, кто первым будет убит при завершении программы,
layout  или widget? Если первым будет убит widget, то он потянет за собой  layout. Что же
после этого будет освобождаться вместо layout?


Название: Re: Порядок создания объектов
Отправлено: Fat-Zer от Февраль 11, 2011, 18:21
А вот в последнем четверостишии, кто первым будет убит при завершении программы,
layout  или widget? Если первым будет убит widget, то он потянет за собой  layout. Что же
после этого будет освобождаться вместо layout?
в последнех двух четверостишьях никто не умрёт, так как вы создали всё на куче, но не вызвали delete; т.е. диструктор ни для того ни для другого вызываться не будет. дефакто это мемори лик, правда не страшный совсем.


Название: Re: Порядок создания объектов
Отправлено: pretender424 от Февраль 11, 2011, 18:31
А если руками уничтожить?
Код:
delete widget;
delete layout;


Название: Re: Порядок создания объектов
Отправлено: GreatSnake от Февраль 11, 2011, 18:33
Цитировать
А если руками уничтожить?
Всё будет хорошо, т.к. Qt об этом уже позаботилась)


Название: Re: Порядок создания объектов
Отправлено: Fat-Zer от Февраль 11, 2011, 18:37
А если руками уничтожить?
Код:
delete widget;
delete layout;
надо попробовать... скорей всего сигфолт будет...


Название: Re: Порядок создания объектов
Отправлено: pretender424 от Февраль 11, 2011, 18:53
Я тоже на это надеялся. Местами менял. Но этого не произошло  :)


Название: Re: Порядок создания объектов
Отправлено: pretender424 от Февраль 11, 2011, 18:54
Под заботой Qt я и имел в виду умные указатели в их классах...