crossplatform.ru

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

4 страниц V  « < 2 3 4  
Ответить в данную темуНачать новую тему
> код ошибки -1073741819
demaker
  опции профиля:
сообщение 5.2.2013, 14:03
Сообщение #31


Студент
*

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

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




Репутация:   0  


Цитата(Алексей1153 @ 5.2.2013, 14:48) *
нужно:

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

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

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


:) ок -> понял


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

Как мне удалить график, который я добавил на виджет?
Чуть подробнее можно. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 5.2.2013, 14:07
Сообщение #32


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

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

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




Репутация:   34  


как удалить - это зависит от того, как добавлял.

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

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

Это желательно :) Так меньше ошибок

Сообщение отредактировал Алексей1153 - 5.2.2013, 14:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 5.2.2013, 14:22
Сообщение #33


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

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

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




Репутация:   8  


Так, а ларчик просто открывался :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:26
Сообщение #34


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

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

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




Репутация:   34  


ну, или std::vector / std::map (лично я кутешные контейнеры стараюсь не использовать, если только никак без этого)

тогда такие забывания просто не существуют
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
demaker
  опции профиля:
сообщение 5.2.2013, 14:27
Сообщение #35


Студент
*

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

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




Репутация:   0  


Понятно, спасибо.
Но у меня вроде так и есть:

деструктор:
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:39
Сообщение #36


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

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

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




Репутация:   34  


вот это
        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;
}


Сообщение отредактировал Алексей1153 - 5.2.2013, 14:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
demaker
  опции профиля:
сообщение 5.2.2013, 15:09
Сообщение #37


Студент
*

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

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




Репутация:   0  


Понятно.

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

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

lanz, Алексей1153 огромное спасибо ВАМ!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 5.2.2013, 18:32
Сообщение #38


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

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

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




Репутация:   34  


demaker, не должно быть таких преобразований. Что-то не так делаешь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 7.3.2021, 2:14