LINUX.ORG.RU

QtQuick App Crash - SEGFAULT

 , ,


0

2

Добрый день! У меня есть приложение, в основном написанное на QML, и использующее несколько расширений, написанных на С++. Одно из расширений является контейнером для моих типов: Item и ItemBox соответственно. ItemBox содержит в себе QList для хранения указателей на Item. При старте приложения у меня создается ItemBox и вызывается метод fillBox, в котором парсится файлик xml и с помощью полученной информации создаются элементы Item. Выглядит это так: main.qml:

 ItemBox {
    id: itemBox
    Component.onCompleted: fillBox()
 }
В самом приложении у меня есть несколько экранов, один из них ( к примеру - TargetScreen) использует ItemBox для получения элементов. Для этого ItemBox имеет методы getItem(int) и itemsCount(). Имеет место следующая ситуация: При открытии приложения ItemBox заполняется, все нормально. Далее я открываю TargetScreen, происходит получение элементов у ItemBox - все нормально. Далее открывается другой экран, и снова TargetScreen - и тут приложение падает. Падает на вызове метода QList::at(int), которые используется в ItemBox::getItem(int). Не могу понять, что происходит с памятью. Есть у кого-нибудь идеи?

Ответ на: комментарий от fluorite

Экраны, представленные отдельными qml-файлами, открываются через StackView с замещением. То бишь, если я два раза открываю TargetScreen, у меня два раза будет использоваться ItemBox.

mashinapetro
() автор топика
Ответ на: комментарий от fluorite

ItemBox.hpp

class Item: public QObject {
  Q_OBJECT
public:
  int code;
  QString name;
  Q_INVOKABLE int getCode();
  Q_INVOKABLE QString getName();
}

class ItemBox: public QObject {
  Q_OBJECT
private: 
  QList<Item *> items;
public:
  ItemBox() { }
  Q_INVOKABLE void fillBox();
  Q_INVOKABLE int  itemsCount();
  Q_INVOKABLE Item* getItem(int);
}
ItemBox.cpp
int Item::getCode() {
  return code;
}
QString Item::getName() {
  return name;
}
void ItemBox::fillBox() { 
  //creating items in heap...
  // and adding them to items list
}

int ItemBox::itemsCount() {
  return items.count();
}

Item* ItemBox::getItem(int index) {
  return items.at(index);
}
main.qml
Item {
  // --//--//--
  ItemBox {
    id: itemBox
    Component.onCompleted {
      itemBox.fillBox()
    }
  } 
  StackView {
    id: stackView
  }
}
TargetScreen.qml
Item {
    Component.onCompleted {
      // print all Items
    for(var i = 0; i < itemBox.itemsCount(); ++i) {
      console.log("Item name: " + itemBox.getItem(i).getName())
      console.log("Item code: " + itemBox.getItem(i).getCode())
    }
}

mashinapetro
() автор топика
Ответ на: комментарий от mashinapetro

SEGFAULT, не показывает?

тыж понимаешь, что рассказываешь сказку?

волгринд натрави, он тебя носом натыкает, если куда вылез.

И да. Не отладочный чтоль собираешь?

anonymous
()
Ответ на: комментарий от anonymous

Дебаггер - не показывает. Но где именно вылетает - знаю. Сборка - Debug. Valgrind - пока ничего в нем не нашел.

mashinapetro
() автор топика
Ответ на: комментарий от fluorite

Все равно падает. Падает на строке

item = items.at(index);
Хотя количество элементов берется правильно.

mashinapetro
() автор топика
Ответ на: комментарий от anonymous

так эксепшн поди необработанный.

assert должен быть. Или ексепшн (хотя я ни разу не видел), сегфолта быть не должно при такой ошибке

Stil ★★★★★
()
Ответ на: комментарий от Stil
template <typename T>
inline const T &QList<T>::at(int i) const
{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::at", "index out of range");
 return reinterpret_cast<Node *>(p.at(i))->t(); }
fluorite ★★★★★
()
Ответ на: комментарий от fluorite

Спасибо, что не поленился заглянуть в код, но к чему ты это скопипастил? К тому, что эксепшена не будет?

Stil ★★★★★
()
Ответ на: комментарий от fluorite

Ви таки считаете, что фrаза «тебе сюда» похожа на вопrос?

Stil ★★★★★
()
Ответ на: комментарий от tnodir
#ifdef Q_COMPILER_NULLPTR
# define Q_NULLPTR         nullptr
#else
# define Q_NULLPTR         0
#endif

Не у всех есть c++11

fluorite ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.