С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Qt

Войти
Регистрация
Восстановить пароль
 
Chehoff
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 4
#1

Сообщение "Программа неожиданно завершилась" при обращении к экземпляру объекту - C++ Qt

07.01.2017, 14:42. Просмотров 193. Ответов 6
Метки нет (Все метки)

Всем доброго здравия!
Имеется программа, которая считывает имена каталогов, на основании этих имён создаёт объекты. Код:
main.cpp:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "notice.h"
#include <QApplication>
#include <QtWidgets>
#include <QVector>
 
int main(int argc, char *argv[])
{
    //читаем названия папок в папке с проектами
    QDir dir(PathToFolder);
    QstringList MaskNotice = ("ABC*", "CDE*");
    QStringList ListProjects = dir.entryList(MaskNotice ,QDir::Dirs);
    //Создаём список объектов и сами объекты
    QVector<Notice*> notices; //Вектор который будет хранить указатели на объекты
    for(int i = 0; i < ListProjects.size(); i++){
        Notice notice(ListProjects[i]);
        notices.push_back(&notice); //Складываем указатели на объекты в вектор
    }
    qDebug() << notices.size();
    qDebug() << notices[0]->GetName();
    qDebug() << notices[1]->GetName();
 
    return 0;
}

notice.h:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef NOTICE_H
#define NOTICE_H
 
#include <QObject>
 
class Notice : public QObject
{
    Q_OBJECT
public:
    explicit Notice(const QString &str, QObject *parent = 0);
    QString GetName();
signals:
 
public slots:
private:
    QString name;
    QString projectName;
    bool isInFolder;
    QString author;
};
 
#endif // NOTICE_H

notice.cpp:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
#include "notice.h"
 
Notice::Notice(const QString &str, QObject *parent) : QObject(parent)
{
    this->name = str;
}
QString Notice::GetName(){
    return this->name;
}


Почему-то вываливается с ошибкой "Программа неожиданно завершилась".
При том иногда один раз обратится даёт, при повторном обращении даже к тому же объекту сваливается.

Запускается ~/build-notice-Desktop_Qt_5_7_1_GCC_64bit-Debug/notice...
4
Программа неожиданно завершилась.
~/build-notice-Desktop_Qt_5_7_1_GCC_64bit-Debug/notice аварийно завершился.


Что я не так делаю?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2017, 14:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сообщение "Программа неожиданно завершилась" при обращении к экземпляру объекту (C++ Qt):

Приложение Qt Quick: "Программа неожиданно завершилась" - C++ Qt
Доброго времени суток. Столкнулся с проблемой при запуске приложения с большим количеством объектов :( Вот вся форма: import QtQuick...

Программа неожиданно завершилась - C++ Qt
До того как собрал .exe в режиме выпуска все было нормально, теперь в режиме отладки все время на любом проекте хоть новом, хоть старом...

Программа неожиданно завершилась Qt - C++ Qt
Запустил рабочий (буквально 10 секунд назад работал) проект, а он мне Программа неожиданно завершилась с кодом -1073741819 естественно...

Программа неожиданно завершилась. - C++ Qt
Пишу текстовый редактор, ошибок нет! Но при компиляции появляется такая надпись: Код: mainwindow.h #include &lt;QMenu&gt; #include...

Программа неожиданно завершилась - C++ Qt
Вылетает ошибка в Выводе приложения, что программа неожиданно завершилсь (завершилась крахом). Раньше отлично компилировалась, а на...

Программа неожиданно завершилась - C++ Qt
Здравствуйте, уважаемые гуру! Помогите новичку=) Есть блок кода: void Quad::FavoritesSave() { QString key; QSettings...

6
Байт
Нарушитель
Эксперт C
16689 / 10952 / 1685
Регистрация: 24.12.2010
Сообщений: 21,352
07.01.2017, 15:47 #2
Chehoff, Твой Notice notice живет только в в цикле (в стеке). Причем после каждого прохода цикла уничтожается. А ты его адрес запоминаешь в векторе. Но этот адрес (указатель) указывает в никуда
1
nd2
2413 / 2002 / 704
Регистрация: 29.01.2016
Сообщений: 6,537
07.01.2017, 15:54 #3
Цитата Сообщение от Chehoff Посмотреть сообщение
Что я не так делаю?
Сохраняешь адреса локальных объектов, созданных в теле цикла, которые исчезают при каждой новой итерации.

Добавлено через 38 секунд
Пока писал, уже ответили.
0
Chehoff
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 4
07.01.2017, 16:23  [ТС] #4
А можно ли в таком случае экземпляр каким-либо образом сохранить? QVector не даёт хранить сами экземпляры, а только указатели на них. Создавать их не в цикле не представляю как.
0
nd2
2413 / 2002 / 704
Регистрация: 29.01.2016
Сообщений: 6,537
07.01.2017, 16:41 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Chehoff Посмотреть сообщение
QVector не даёт хранить сами экземпляры, а только указатели на них.
С каких пор? Добавь в класс конструктор по умолчанию.
Цитата Сообщение от Chehoff Посмотреть сообщение
Создавать их не в цикле не представляю как.
Хочешь хранить указатели: создавай объекты через new.
1
Chehoff
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 4
07.01.2017, 16:49  [ТС] #6
Цитата Сообщение от nd2 Посмотреть сообщение
С каких пор?
Значения, хранящиеся в различных контейнерах, могут быть любого присваиваемого типа данных. Для этого тип должен предоставлять конструктор по умолчанию, конструктор копирования и оператор присваивания. Это охватывает большинство типов данных, которые вы, вероятно, захотите поместить в контейнер, включая базовые типы, такие как int и double, типы указателей и типы данных Qt, такие как QString, QDate и QTime, но не охватывает типы QObject или любые из подклассов QObject (QWidget, QDialog, QTimer, и т.д.). Если вы попытаетесь создать экземпляр QList<QWidget>, компилятор сообщит, что конструктор копирования и операторы присваивания QWidget запрещены. Если вы хотите поместить эти виды объектов в контейнер, то поместите указатели на них, например, так QList<QWidget *>тут.

Цитата Сообщение от nd2 Посмотреть сообщение
Хочешь хранить указатели: создавай объекты через new.
C++ (Qt)
1
2
3
4
for(int i = 0; i < ListProjects.size(); i++){
        Notice* notice = new Notice(ListProjects[i]);
        notices.push_back(notice);
    }
Спасибо за помощь! Заработало.
0
nd2
2413 / 2002 / 704
Регистрация: 29.01.2016
Сообщений: 6,537
07.01.2017, 17:01 #7
Цитата Сообщение от Chehoff Посмотреть сообщение
QVector не даёт хранить сами экземпляры, а только указатели на них.
Ты имел ввиду свой класс. Понял.
0
07.01.2017, 17:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2017, 17:01
Привет! Вот еще темы с ответами:

программа неожиданно завершилась с кодом .... - C++ Qt
скомпилился проект нормально но при запуске :::: Запускается...

Программа неожиданно завершилась (с крахом) - C++ (Qt) - C++ Qt
Пиши свою первую игру. Пока на стадии организации связи между формами. Но... При запуске вылетает ошибка неожиданное завершение программы...

Программа неожиданно завершилась с кодом -1073741511 - C++ Qt
Для своей программе я пытался подключить NCReport и сделал так чтобы при нажатии на кнопку генерировал отчет данных, которые выводятся в...

Программа неожиданно завершилась. Когда соединяю сигнал со слотом - C++ Qt
В конструкторе прописал: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.