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

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

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

Сообщений: 5877


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


Просмотр профиля 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.026 секунд. Запросов: 19.