Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 4

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

07.01.2017, 14:42. Показов 2113. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.01.2017, 14:42
Ответы с готовыми решениями:

Программа неожиданно завершилась
Программа неожиданно завершается 15:40:09: Запускается D:\build-54-Desktop_Qt_5_12_2_MinGW_64_bit-Debug\debug\54.exe... 15:40:12:...

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

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

6
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.01.2017, 15:47
Chehoff, Твой Notice notice живет только в в цикле (в стеке). Причем после каждого прохода цикла уничтожается. А ты его адрес запоминаешь в векторе. Но этот адрес (указатель) указывает в никуда
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
07.01.2017, 15:54
Цитата Сообщение от Chehoff Посмотреть сообщение
Что я не так делаю?
Сохраняешь адреса локальных объектов, созданных в теле цикла, которые исчезают при каждой новой итерации.

Добавлено через 38 секунд
Пока писал, уже ответили.
0
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 4
07.01.2017, 16:23  [ТС]
А можно ли в таком случае экземпляр каким-либо образом сохранить? QVector не даёт хранить сами экземпляры, а только указатели на них. Создавать их не в цикле не представляю как.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
07.01.2017, 16:41
Лучший ответ Сообщение было отмечено Chehoff как решение

Решение

Цитата Сообщение от Chehoff Посмотреть сообщение
QVector не даёт хранить сами экземпляры, а только указатели на них.
С каких пор? Добавь в класс конструктор по умолчанию.
Цитата Сообщение от Chehoff Посмотреть сообщение
Создавать их не в цикле не представляю как.
Хочешь хранить указатели: создавай объекты через new.
1
0 / 0 / 0
Регистрация: 07.01.2017
Сообщений: 4
07.01.2017, 16:49  [ТС]
Цитата Сообщение от 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
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
07.01.2017, 17:01
Цитата Сообщение от Chehoff Посмотреть сообщение
QVector не даёт хранить сами экземпляры, а только указатели на них.
Ты имел ввиду свой класс. Понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2017, 17:01
Помогаю со студенческими работами здесь

Программа неожиданно завершилась
Не могу понять, из=за этого куска программа не работает, пишу в qt while (stop==0) { for (int i = 0; i &lt; n; i++) ...

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

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

Программа неожиданно завершилась Qt C++
Здравствуйте форумчане! Пытаюсь сделать программу с кастомным окном в Qt. Вот код։ MainWindow::MainWindow(QWidget *parent) :...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru