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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Порядок создания объектов  (Прочитано 12839 раз)
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 ***

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

Ткните носом, пожалуйста...  В замешательстве
Записан
ilyagoo
Гость
« Ответ #1 : Февраль 11, 2011, 13:47 »

assistant говорит
void QWidget::setLayout ( QLayout * layout )
The QWidget will take ownership of layout

это значит, что при разрушении виджета лэйаут им убивается, а он у тебя создан в стеке.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


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

Т.е. при разворачивании стека сначала убивается виджет, который грохает своих детей (в данном случае лайот), а потом грохается лайот (который уже грохнут).
Записан

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

а в первом рабочем варианте этого не происходит, т.к. лэйаут умирает первым и удаляет себя из родителя.
Записан
pretender424
Гость
« Ответ #4 : Февраль 11, 2011, 14:19 »

В очередной раз проблема в RTFM  Улыбающийся

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

Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

4-й вариант ничем не отличается от 3-го  Улыбающийся
Записан

Qt 5.11/4.8.7 (X11/Win)
pretender424
Гость
« Ответ #6 : Февраль 11, 2011, 17:01 »

Это из-за умных указателей?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Цитировать
Это из-за умных указателей?
Да нет, причём здесь умные указатели? Да и где вы их видите?
Просто порядок создания ни от кого независящих объектов в куче не имеет значения.
Записан

Qt 5.11/4.8.7 (X11/Win)
Fat-Zer
Гость
« Ответ #8 : Февраль 11, 2011, 18:15 »

Это из-за умных указателей?
скорей как раз потому, что такие не применяются Подмигивающий
Записан
pretender424
Гость
« Ответ #9 : Февраль 11, 2011, 18:17 »

А вот в последнем четверостишии, кто первым будет убит при завершении программы,
layout  или widget? Если первым будет убит widget, то он потянет за собой  layout. Что же
после этого будет освобождаться вместо layout?
Записан
Fat-Zer
Гость
« Ответ #10 : Февраль 11, 2011, 18:21 »

А вот в последнем четверостишии, кто первым будет убит при завершении программы,
layout  или widget? Если первым будет убит widget, то он потянет за собой  layout. Что же
после этого будет освобождаться вместо layout?
в последнех двух четверостишьях никто не умрёт, так как вы создали всё на куче, но не вызвали delete; т.е. диструктор ни для того ни для другого вызываться не будет. дефакто это мемори лик, правда не страшный совсем.
Записан
pretender424
Гость
« Ответ #11 : Февраль 11, 2011, 18:31 »

А если руками уничтожить?
Код:
delete widget;
delete layout;
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Февраль 11, 2011, 18:33 »

Цитировать
А если руками уничтожить?
Всё будет хорошо, т.к. Qt об этом уже позаботилась)
Записан

Qt 5.11/4.8.7 (X11/Win)
Fat-Zer
Гость
« Ответ #13 : Февраль 11, 2011, 18:37 »

А если руками уничтожить?
Код:
delete widget;
delete layout;
надо попробовать... скорей всего сигфолт будет...
Записан
pretender424
Гость
« Ответ #14 : Февраль 11, 2011, 18:53 »

Я тоже на это надеялся. Местами менял. Но этого не произошло  Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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