Russian Qt Forum

Qt => Общие вопросы => Тема начата: yesrus от Май 14, 2009, 18:47



Название: Программа падает, if\try\catch etc не помогают, что делать ?
Отправлено: yesrus от Май 14, 2009, 18:47
qt 4.5.1
Вобщем падает программа на операции присвоения 1... есть некая переменная int в кастом классе который наследуется от пашбаттона, путем дебага выловил, что крашит именно на команде stat = 1; пробовал помещать в if ( stat = 1) пробовал в try { stat = 1; } catch..... бесполезно...падает мертво, что делать и как найти причину крашей ?
Падает постоянно после определенных действий...т.е. если их не выполнять то хоть 100 этих кастом кнопок будут норм. работать...причем во время нормальной работы будет так же выполняться тот же самый кусок кода который вызывает краш.
Весь код выкладывать не могу, могу выслать кому-нибудь в личку.
 :(


Название: Re: Программа падает, if\try\catch etc не помогают, что делать ?
Отправлено: EhTemka от Май 14, 2009, 18:54
Убедись, что класс "который наследуется от пашбаттона" уже создан на момент присвоения.


Название: Re: Программа падает, if\try\catch etc не помогают, что делать ?
Отправлено: ритт от Май 14, 2009, 19:12
первая мысль - mainbuttonmap.value(channel) возвращает невалидный указатель.
сложно угадывать, не видя хотя бы кода создания/использования кнопки и декларации/конструктора класса кнопки


Название: Re: Программа падает, if\try\catch etc не помогают, что делать ?
Отправлено: EhTemka от Май 14, 2009, 19:32
Цитировать
К тому же если бы указатель был не валидным то и до stat действие бы не доходило

Не факт. Поставь проверку

Код:
void gui::newState(const QString &channel, const int &state) {
     if (state == 5) {
      fbutton *a = mainbuttonmap.value(channel);
      if (a)
          a->startblink();
  }
}


Я почти уверен что дело в этом...


Название: Re: Программа падает, if\try\catch etc не помогают, что делать ?
Отправлено: yesrus от Май 14, 2009, 19:41
Цитировать
К тому же если бы указатель был не валидным то и до stat действие бы не доходило

Не факт. Поставь проверку

Код:
void gui::newState(const QString &channel, const int &state) {
     if (state == 5) {
      fbutton *a = mainbuttonmap.value(channel);
      if (a)
          a->startblink();
  }
}


Я почти уверен что дело в этом...
Спасибо!
Вы оказались правы  :) единственное место в котором не было проверки существования канала. (добавил if (mainbuttonmap.contains(channel)) .... и все ок)


Название: Re: Программа падает, if\try\catch etc не помогают, что делать ?
Отправлено: ритт от Май 14, 2009, 19:58
ох, не верю )


Название: Re: Программа падает, if\try\catch etc не помогают, что делать ?
Отправлено: ритт от Май 14, 2009, 20:03
код удалил (шибко секретный, что ли?) - теперь по памяти придётся...
mainbuttonmap - вроде бы QMap или QHash - документация говорит, что при отсутствующем ключе ::value(..) возвращает значение по умолчанию; для QPushButton* значением по умолчанию будет (QPushButton*)0, а при попытке доступа к члену несуществующего объекта получаем сегфолт...
...примерно так