• 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
176 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,860 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,063 wizyt
pytanie zadane 26 sierpnia 2015 w C i C++ przez Jakub Nowacki Początkujący (470 p.)
0 głosów
0 odpowiedzi 95 wizyt
–1 głos
0 odpowiedzi 210 wizyt
pytanie zadane 23 lipca 2019 w C i C++ przez Ewaryst Ławecki Obywatel (1,710 p.)

92,677 zapytań

141,581 odpowiedzi

320,061 komentarzy

62,039 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

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!

...