• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego Qt Creator wyrzuca mi wyjątek?

Object Storage Arubacloud
0 głosów
166 wizyt
pytanie zadane 20 września 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)

Witam, mam taki kod jak poniżej napisany w bibliotece Qt, język C++. Wszystko działa ta jak chcę , ale w momencie wyłączania programu wyskakuje mi taki wyjątek jak poniżej. Dlaczego tak jest i jak mam to usunąć?

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFrame>

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

    QWidget mainWindow;
    mainWindow.resize(800, 600);

    QHBoxLayout mainLayout;
    mainLayout.setAlignment(Qt::AlignLeft);

    QVBoxLayout buttonsLayou;
    buttonsLayou.setAlignment(Qt::AlignTop);
    buttonsLayou.setContentsMargins(0, 0, 0, 0);

    QFrame frame1(&mainWindow);
    frame1.setObjectName("myObject");
    frame1.setStyleSheet("#myObject { border: 1px solid black; }");
    frame1.setMinimumSize(200, 200);
    mainLayout.addWidget(&frame1);

    QPushButton btn1("One", &frame1);
    QPushButton btn2("Two", &frame1);
    QPushButton btn3("Three", &frame1);
    QPushButton btn4("Four", &frame1);

    btn1.setMinimumSize(200, 40);
    btn2.setMinimumSize(200, 40);
    btn3.setMinimumSize(200, 40);
    btn4.setMinimumSize(200, 40);

    buttonsLayou.addWidget(&btn1);
    buttonsLayou.addWidget(&btn2);
    buttonsLayou.addWidget(&btn3);
    buttonsLayou.addWidget(&btn4);

    frame1.setLayout(&buttonsLayou);

    mainWindow.setLayout(&mainLayout);
    mainWindow.show();
    return app.exec();
}

1 odpowiedź

0 głosów
odpowiedź 20 września 2021 przez tangarr Mędrzec (154,780 p.)

Podczas niszczenia obiektu klasy QObject (z której dziedziczone są wszystkie widgety) niszczone są również wszystkie obiekty przypisane go niego jako obiekty potomne. Jeżeli dziecko obiektu jest obiektem na stosie lub globalnym to może się zdarzyć, że dziecko będzie niszczone dwa razy (double free) co powoduje wykrzaczenie programu.

https://doc.qt.io/qt-5/qobject.html#dtor.QObject
 

Zaalokuj dynamicznie wszytkie obiekty potomne.

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFrame>

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

    QWidget mainWindow;
    mainWindow.resize(800, 600);

    auto mainLayout = new QHBoxLayout();
    mainLayout->setAlignment(Qt::AlignLeft);

    auto buttonsLayou = new QVBoxLayout();
    buttonsLayou->setAlignment(Qt::AlignTop);
    buttonsLayou->setContentsMargins(0, 0, 0, 0);

    auto frame1 = new QFrame(&mainWindow);
    frame1->setObjectName("myObject");
    frame1->setStyleSheet("#myObject { border: 1px solid black; }");
    frame1->setMinimumSize(200, 200);
    mainLayout->addWidget(frame1);

    auto btn1 = new QPushButton("One", frame1);
    auto btn2 = new QPushButton("Two", frame1);
    auto btn3 = new QPushButton("Three", frame1);
    auto btn4 = new QPushButton("Four", frame1);

    btn1->setMinimumSize(200, 40);
    btn2->setMinimumSize(200, 40);
    btn3->setMinimumSize(200, 40);
    btn4->setMinimumSize(200, 40);

    buttonsLayou->addWidget(btn1);
    buttonsLayou->addWidget(btn2);
    buttonsLayou->addWidget(btn3);
    buttonsLayou->addWidget(btn4);

    frame1->setLayout(buttonsLayou);

    mainWindow.setLayout(mainLayout);
    mainWindow.show();
    return app.exec();
}

 

komentarz 20 września 2021 przez tonn204 Mądrala (7,440 p.)
Dzięki za radę, wszystko działa :D!!!

Podobne pytania

0 głosów
1 odpowiedź 1,034 wizyt
pytanie zadane 26 sierpnia 2015 w C i C++ przez Jakub Nowacki Początkujący (470 p.)
0 głosów
0 odpowiedzi 92 wizyt
–1 głos
0 odpowiedzi 199 wizyt
pytanie zadane 23 lipca 2019 w C i C++ przez Ewaryst Ławecki Obywatel (1,710 p.)

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...