crossplatform.ru

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


  Ответ в код ошибки -1073741819
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Алексей1153 Дата 5.2.2013, 18:32
  demaker, не должно быть таких преобразований. Что-то не так делаешь
demaker Дата 5.2.2013, 15:09
  Понятно.

Ну в item должен быть указатель на plot
за этим я и создал TreeWidgetitem от QTreeWidgetitem

но сигнал itemDoubleClicked(QTreeWidgetItem*,int) передает только QTreeWidgetItem*, поэтому приходится делать явное преобразование типов ((TreeWidgetItem*)item)->p

lanz, Алексей1153 огромное спасибо ВАМ!!!
Алексей1153 Дата 5.2.2013, 14:39
  вот это
        listPlot.removeOne(((TreeWidgetItem*)item)->p);
        ((TreeWidgetItem*)item)->p->deleteLater();
        ((TreeWidgetItem*)item)->setCheckState(0,Qt::Unchecked);

должно выглядеть так (в первом приближении)
     listPlot.removeOne(item);
     item->delete_my_p();
//delete item; возможно, это тоже тут


...::delete_my_p()
{
      delete p;
      p=0;
}
demaker Дата 5.2.2013, 14:27
  Понятно, спасибо.
Но у меня вроде так и есть:

деструктор:
Widget::~Widget()
{
    for(int i = 0; i<listPlot.length();i++)
    {
        listPlot.at(i)->deleteLater();
    }
    listPlot.clear();

    items.clear();

    delete ui;
}

одиночное удаление:
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)->setCheckState(0,Qt::Unchecked);
    }
}

и создание:
void Widget::dropEvent(QDropEvent *event)
{
    if (event->mimeData()->hasFormat("application/x-qt-windows-mime;value=\"ComtradeChannel\""))
    {
        QByteArray d(event->mimeData()->data("application/x-qt-windows-mime;value=\"ComtradeChannel\""));

        if (d != QVariant(-1).toByteArray())
        {
            qDebug()<<"d = "<<d;
            comtrade_curve_t c= possible_curves.at(d.at(0));

            qDebug()<<c.Filename;
            qDebug()<<c.type;
            qDebug()<<c.channel_num;
            event->acceptProposedAction();

            Plot* plot = new Plot(c.Filename,c.type,c.channel_num,0);
            vbl_plot->addWidget(plot);
            listPlot.append(plot);

            qDebug() <<"number = "<<index;
            plot->item = items.at(index);
            items.at(index)->p = plot;
            qDebug() <<"plot = "<<items.at(index)->p;
        }
        else
        {
        }
    }
}


Не могу понять что нето. :unsure:
Спасибо.
Попробую заново переписать.
Алексей1153 Дата 5.2.2013, 14:26
  ну, или std::vector / std::map (лично я кутешные контейнеры стараюсь не использовать, если только никак без этого)

тогда такие забывания просто не существуют
lanz Дата 5.2.2013, 14:22
  Так, а ларчик просто открывался :lol:
Все падает в ~CCOMTRADE, когда удаляются неинициализированные
    if(TimeDataVector != NULL) delete[] TimeDataVector;
    if(AnalogDataVector != NULL) delete[] AnalogDataVector;
    if(DigitalDataVector != NULL) delete[] DigitalDataVector;


Лечится добавлением в конструктор
TimeDataVector = NULL;
AnalogDataVector = NULL;
DigitalDataVector = NULL;


Но вообще Алексей1153 дело говорит.
И еще поменьше new/delete, а вместо них побольше QVector-ов.
Алексей1153 Дата 5.2.2013, 14:07
  как удалить - это зависит от того, как добавлял.

К примеру, ты в какой-то момент времени создаёшь на куче через new и добавляешь к плоттеру (теперь плоттер САМ заботится об удалении графика - в деструкторе это произойдёт) . Если ты извлёк график (навроде removeitem) , то плоттер уже не заботится о его судьбе. Ты можешь сразу после извлечения удалить память графика при помощи delete - так как сам он не удалится. Но это просто утечка памяти, а не выпадение

Придерживайся правила - где создал объект, там и удаляй.
В одном классе.
В двух методах одного класса (create/delete).
В одном методе (на стеке, к примеру) .
В одном потоке. Не надо делать так - в одном потоке создал, в другом удалил.
В одном процессе.

Это желательно :) Так меньше ошибок
demaker Дата 5.2.2013, 14:03
 
Цитата(Алексей1153 @ 5.2.2013, 14:48) *
нужно:

1) решить, какой класс управляет данными в массиве (в частности - в мапе, в списке)
2) инкапсулировать массив в этот класс с доступом private
3) сделать методы Clear(), DeleteItem(), .... , AddItem(), FindItem(), ...
4) из конструктора класса вызвать Clear()

и не мучать себя и остальных :D

и, естественно, никаких deleteLater


:) ок -> понял


И еще такой вопрос по поводу deleteLater.

Как мне удалить график, который я добавил на виджет?
Чуть подробнее можно. :)
Алексей1153 Дата 5.2.2013, 13:48
  нужно:

1) решить, какой класс управляет данными в массиве (в частности - в мапе, в списке)
2) инкапсулировать массив в этот класс с доступом private
3) сделать методы Clear(), DeleteItem(), .... , AddItem(), FindItem(), ...
4) из конструктора класса вызвать Clear()

и не мучать себя и остальных :D

и, естественно, никаких deleteLater
demaker Дата 5.2.2013, 13:41
  Не, все так же
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 3:03