crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> код ошибки -1073741819
demaker
  опции профиля:
сообщение 1.2.2013, 15:59
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 29.1.2013
Пользователь №: 3691

Спасибо сказали: 0 раз(а)




Репутация:   0  


Никак не могу отловить ошибку.
Вроде все что создавал на куче удаляю за собой.

И все равно выдает.

завершился с кодом -1073741819

Использую библиотеку QWT

когда в дебаге отлавливаю то программа вылетает здесь:
template <typename T>
QwtPlotSeriesItem<T>::~QwtPlotSeriesItem()
{
    delete d_series;
}


а начинается на этом участке:
void Widget::sl_deletePlot(QTreeWidgetItem*item,int column)
{
    qDebug()<<"sl_deletePlot";
    qDebug()<<"plot = "<<((TreeWidgetItem*)item)->p;

    ((TreeWidgetItem*)item)->p->deleteLater();    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    listPlot.removeOne(((TreeWidgetItem*)item)->p);
}


Может кто-то сталкивался???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 1.2.2013, 21:10
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


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

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 2.2.2013, 1:58
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


PS: так выводит сам Qt Creator, по этому - увы
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 2.2.2013, 17:25
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(RazrFalcon @ 2.2.2013, 4:58) *
PS: так выводит сам Qt Creator, по этому - увы

садизм какой-то. причём неоправданный :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.2.2013, 16:20
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(demaker @ 1.2.2013, 17:59) *
void Widget::sl_deletePlot(QTreeWidgetItem*item,int column)
{
    qDebug()<<"sl_deletePlot";
    qDebug()<<"plot = "<<((TreeWidgetItem*)item)->p;

    ((TreeWidgetItem*)item)->p->deleteLater();    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    listPlot.removeOne(((TreeWidgetItem*)item)->p);
}
Можно получить комментарий, к каждой строчке? Я не понимаю того, что здесь делается.

Особенно интересует разбор этого:
((TreeWidgetItem*)item)->p
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 4.2.2013, 8:45
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Ноосфера подсказывает мне что дело в двойном удалении item->p.

((TreeWidgetItem*)item)->p->deleteLater();    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
listPlot.removeOne(((TreeWidgetItem*)item)->p);


Сначала removeOne удаляет элемент, затем управление возвращается в event loop и выполняется удаление по deleteLater.
Можно попробовать убрать deleteLater.
Еще возможно, если item был создан с parent то parent его удалит (это будет уже третье удаление).

Для диагностики можно добавить печаталку в деструктор.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
demaker
  опции профиля:
сообщение 4.2.2013, 11:54
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 29.1.2013
Пользователь №: 3691

Спасибо сказали: 0 раз(а)




Репутация:   0  


void Widget::sl_deletePlot(QTreeWidgetItem*item,int column)
{
    qDebug()<<"sl_deletePlot";

    if( (((TreeWidgetItem*)item)->checkState(0) == Qt::Checked) && (((TreeWidgetItem*)item)->p != NULL) )
    {
        qDebug()<<"plot = "<<((TreeWidgetItem*)item)->p;
        listPlot.removeOne(((TreeWidgetItem*)item)->p);
        ((TreeWidgetItem*)item)->p->deleteLater();
    }
}


((TreeWidgetItem*)item)->p // это указатель на плот, который принадлежит item


class Plot;
class TreeWidgetItem: public QObject, public QTreeWidgetItem
{
    Q_OBJECT

public:
    Plot* p;

public:
    explicit TreeWidgetItem(TreeWidgetItem*parent);
    explicit TreeWidgetItem(QTreeWidget*parent);
    explicit TreeWidgetItem(QTreeWidgetItem*parent);
    ~TreeWidgetItem();
};


и СООТВЕТСТВЕННО

   connect(tree,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(sl_deletePlot(QTreeWidgetItem*,int)));


по коннектету
вызывается слот для удаления плота
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.2.2013, 12:01
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


необходимость явного приведения - уже признак кривизны кода :)

((TreeWidgetItem*)item)->p

скажи, зачем это делаешь ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
demaker
  опции профиля:
сообщение 4.2.2013, 12:06
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 29.1.2013
Пользователь №: 3691

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 4.2.2013, 13:01) *
необходимость явного приведения - уже признак кривизны кода :)

((TreeWidgetItem*)item)->p

скажи, зачем это делаешь ?


Чтобы знать какому item принадлежит какой plot

((TreeWidgetItem*)item)->p
Потому что сигнал itemDoubleClicked(QTreeWidgetItem*,int) !!!QTreeWidgetItem
а у меня TreeWidgetItem
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.2.2013, 12:09
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


demaker,
указатель item должен уметь рассказывать это без явного приведения. Либо через виртуальную функцию, либо через dynamic_cast, либо через стороннюю ассоциативную таблицу


Чтобы долго всем мозги догадками не компостировать, прицепи проект ))



Сообщение отредактировал Алексей1153 - 4.2.2013, 12:18
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 15:29