crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Где утекает память?, QGraphicsItem+ Scena
Гость_Денис_*
сообщение 10.5.2011, 14:46
Сообщение #1





Гости








    


(Зациклил кусок мэйна и получил не хилую утечку)
Код в мэйне
Раскрывающийся текст
  
        fx,px ... указатели на объекты класса наследуемого от QGraphicsItem .
        Razmetka(ui->doubleSpinBoxA->value(),ui->doubleSpinBoxB->value(),ui->doubleSpinBoxC->value(),ui->doubleSpinBoxD->value());
        if(fx!=NULL)delete fx;
        fx=new Graphic();
        if(f1x!=NULL) delete f1x;
        f1x=new PrGraphic();
        if(Px!=NULL) delete Px;
        ...
        scene->addItem(fx);
        scene->addItem(P1x);
        scene->addItem(Px);
        scene->addItem(Rx);
        scene->addItem(f1x);


Метод Разметка
Раскрывающийся текст
while(!vec.empty()){
        scene->removeItem(vec.at(0));
        vec.pop_front();
    }
...
text=scene->addText(t.toString(),f);
text->setPos(QPointF(i*30,600)+pog);
vec.append(text);

В классах от QGr... динамически не выделяю ни под чего.
Думаю на delete , он удаляет память на которую указывает указатель ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 10.5.2011, 15:10
Сообщение #2


Zombie Mod
*****

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

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




Репутация:   212  


А без проверки на NULL утечка есть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 10.5.2011, 15:55
Сообщение #3


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

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


На NULL можно не проверять.
Цитата
C++ guarantees that operator delete checks its argument for null-ness. If the argument is 0, the delete expression has no effect. In other words, deleting a null pointer is a safe (yet useless) operation. There is no need to check the pointer for null-ness before passing it to delete:


if (p) // useless; delete already checks for a null value
delete(p);


Тут вероятно что-то не так внутри класса, наследуемого от QGraphicsItem. Если в этом цикле убрать все, кроме создания/удаления объектов класса, что будет? И наоборот. Тут методом исключения - и сразу будет ясно что к чему.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.5.2011, 17:03
Сообщение #4


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

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

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




Репутация:   94  


Цитата(Гость_Денис_* @ 10.5.2011, 17:46) *
Думаю на delete , он удаляет память на которую указывает указатель ?
конечно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Antiglobalist
  опции профиля:
сообщение 10.5.2011, 21:09
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 29.3.2010
Пользователь №: 1574

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




Репутация:   0  


Место утечки нашел(Метод Разметка)
Раскрывающийся текст
QVector<QGraphicsItem *> vec;

void MainWindow::Razmetka(double a, double b, double c, double d)
{
    while(!vec.empty()){
        scene->removeItem(vec.at(0));
        vec.pop_front();
    }
    ..............
        text=scene->addText(t.toString(),f);text->setPos(QPointF(0,600-i*30)+pog);vec.append(text);
    }
}


Заменил scene->removeItem(vec.at(0)); на delete vec.at(0);

На счет NULL проверок , да можно убрать если в конструкторе указатели приравнять к NULL , иначе ошибка.
Всем Спасибо =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




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