Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Chehoff
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 4
07.01.2017, 14:42     Сообщение "Программа неожиданно завершилась" при обращении к экземпляру объекту #1
Всем доброго здравия!
Имеется программа, которая считывает имена каталогов, на основании этих имён создаёт объекты. Код:
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 аварийно завершился.


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

C++ Qt Программа неожиданно завершилась.
программа неожиданно завершилась с кодом .... C++ Qt
C++ Qt Программа неожиданно завершилась Qt
C++ Qt Программа неожиданно завершилась
C++ Qt qt программа неожиданно завершилась, после удаления ошибки из кода.Помогло только
C++ Qt Приложение Qt Quick: "Программа неожиданно завершилась"
C++ Qt Программа неожиданно завершилась
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
14281 / 9112 / 1309
Регистрация: 24.12.2010
Сообщений: 16,667
07.01.2017, 15:47     Сообщение "Программа неожиданно завершилась" при обращении к экземпляру объекту #2
Chehoff, Твой Notice notice живет только в в цикле (в стеке). Причем после каждого прохода цикла уничтожается. А ты его адрес запоминаешь в векторе. Но этот адрес (указатель) указывает в никуда
nd2
1274 / 1013 / 349
Регистрация: 29.01.2016
Сообщений: 3,132
07.01.2017, 15:54     Сообщение "Программа неожиданно завершилась" при обращении к экземпляру объекту #3
Цитата Сообщение от Chehoff Посмотреть сообщение
Что я не так делаю?
Сохраняешь адреса локальных объектов, созданных в теле цикла, которые исчезают при каждой новой итерации.

Добавлено через 38 секунд
Пока писал, уже ответили.
Chehoff
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 4
07.01.2017, 16:23  [ТС]     Сообщение "Программа неожиданно завершилась" при обращении к экземпляру объекту #4
А можно ли в таком случае экземпляр каким-либо образом сохранить? QVector не даёт хранить сами экземпляры, а только указатели на них. Создавать их не в цикле не представляю как.
nd2
1274 / 1013 / 349
Регистрация: 29.01.2016
Сообщений: 3,132
07.01.2017, 16:41     Сообщение "Программа неожиданно завершилась" при обращении к экземпляру объекту #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Chehoff Посмотреть сообщение
QVector не даёт хранить сами экземпляры, а только указатели на них.
С каких пор? Добавь в класс конструктор по умолчанию.
Цитата Сообщение от Chehoff Посмотреть сообщение
Создавать их не в цикле не представляю как.
Хочешь хранить указатели: создавай объекты через new.
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);
    }
Спасибо за помощь! Заработало.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2017, 17:01     Сообщение "Программа неожиданно завершилась" при обращении к экземпляру объекту
Еще ссылки по теме:

C++ Qt Программа неожиданно завершилась
C++ Qt Программа неожиданно завершилась (с крахом) - C++ (Qt)
Программа неожиданно завершилась с кодом -1073741511 C++ Qt
Возникает ошибка "database not open" при обращении из разных потоков C++ Qt
Программа неожиданно завершилась. Когда соединяю сигнал со слотом C++ Qt

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

Или воспользуйтесь поиском по форуму:
nd2
1274 / 1013 / 349
Регистрация: 29.01.2016
Сообщений: 3,132
07.01.2017, 17:01     Сообщение "Программа неожиданно завершилась" при обращении к экземпляру объекту #7
Цитата Сообщение от Chehoff Посмотреть сообщение
QVector не даёт хранить сами экземпляры, а только указатели на них.
Ты имел ввиду свой класс. Понял.
Yandex
Объявления
07.01.2017, 17:01     Сообщение "Программа неожиданно завершилась" при обращении к экземпляру объекту
Ответ Создать тему
Опции темы

Текущее время: 15:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru