Создание объектов в стеке привело к сбою моего приложения Qt6.C++

Программы на C++. Форум разработчиков
Anonymous
 Создание объектов в стеке привело к сбою моего приложения Qt6.

Сообщение Anonymous »

Я пытаюсь понять, почему мое приложение Qt6 вызывает сильный сбой при создании объектов в стеке и отсутствии использования указателей, чисто для обучения.
У меня есть рабочая версия,< /p>

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include "main.h"

#include "moc_main.cpp"  // Ensure the moc file is included

DialogB::DialogB(QWidget *parent) : QDialog(parent)
{
setWindowTitle("Dialog B");
setLayout(new QVBoxLayout());

QPushButton *closeButton = new QPushButton("Close", this);
layout()->addWidget(closeButton);

setWindowModality(Qt::ApplicationModal);

connect(closeButton, &QPushButton::clicked, this, &DialogB::close_dialog);
}

void DialogB::close_dialog()
{
std::cout show();
dialogB->show();
}

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

QDialog *mainwindow = new QDialog();
mainwindow->setWindowTitle("Main Window");
mainwindow->show();

ABParent *abparent = new ABParent(mainwindow);
abparent->show();

int result = app.exec();

delete mainwindow;
delete abparent;
return result;
}
С соответствующим заголовочным файлом

Код: Выделить всё

#pragma once

#include 

class DialogB;

class ABParent : public QDialog {
Q_OBJECT

public:
QDialog *dialogA;
DialogB *dialogB;

ABParent(QWidget *parent = nullptr);
};

class DialogB : public QDialog {
Q_OBJECT

public:
DialogB(QWidget *parent = nullptr);
public slots:
void close_dialog();
};
CMakeLists.txt

Код: Выделить всё

cmake_minimum_required(VERSION 3.30)

project(QtBug)

set(CMAKE_AUTOMOC ON)

find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)

qt_add_executable(QtBug main.cpp)

target_include_directories(QtBug PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include)

target_link_libraries(QtBug PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets)

Теперь при создании объектов внутри основного в стеке, например

Код: Выделить всё

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

QDialog mainwindow;
mainwindow.setWindowTitle("Main Window");
mainwindow.show();

ABParent abparent = new ABParent(&mainwindow);
abparent.show();

return app.exec();
}
Это приводит к полному сбою моего приложения. Мое понимание стека и кучи ясно, но поскольку мы никогда не выходим из main, стек не должен выполнять удаление объектов, созданных в main, поскольку цикл событий предотвратит выход. p>
Следовательно, поскольку куча и стек используют разные методы хранения объектов в памяти и поскольку мы не выходим из main для очистки стека, почему создание объектов здесь может вызвать аппаратный сбой?

Подробнее здесь: https://stackoverflow.com/questions/790 ... pplication

Вернуться в «C++»