Russian Qt Forum
Октябрь 02, 2024, 05:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Ошибка удаления объекта класса  (Прочитано 11914 раз)
ufna
Гость
« Ответ #15 : Ноябрь 15, 2010, 13:50 »

Приводи минимальный код с проблемой.
Записан
MuLLIKA
Гость
« Ответ #16 : Ноябрь 15, 2010, 15:43 »

Есть 3 класса: class mainW : public QMainWindow, class SceneExm : public QGraphicsScene, class generaot4astot : public QMainWindow
в mainW делаеться scene = new SceneExm();
в SceneExm - GenerSc  = new generaot4astot(++GenerOnScene, this);
                    itemSc = new graphitemclass(graphitemclass::generator4ast_DT, GenerSc->sceneContextMenu, GenerSc);
Здесь на сцену добавляеться объект класса генератор. По щельчку правой кнопкой на объект вызываеться ф-ия удаления в классе генератора:
void generaot4astot::removeItem()
{
    QGraphicsItem *item;
    foreach (item, sc->selectedItems())
    {
        qgraphicsitem_cast<graphitemclass *>(item)->removeLines();
        sc->removeItem(item);
        sc->RemSc = this;

    }
//sc->removeItemGenerator(item, this);
    //this->~generaot4astot();
}
тут я пробую вызвать деструктор, по прохождению деструктора дебаггер выкидывает ошибку с ссылкой на строку в классе QScopedPointer(что то такое) 
inline T *data() const
    {
        return d;
    }
Но при выполнении программы, при удалении объекта ошибка не вылетает, но память не освобождаеться. (смотерл в диспетчере задач)
Записан
ufna
Гость
« Ответ #17 : Ноябрь 17, 2010, 17:43 »

Брр, сделай проект с минимальным кодом для этой ошибки. А то сооовершенно непонятно ничего.

кстати, деструктор так вызывать не следует.
Записан
MuLLIKA
Гость
« Ответ #18 : Ноябрь 18, 2010, 02:16 »

Я разобрался в чем проблема мне нужен поток который будет подчищять удаленые итемы со сцены.
Но возникла проблема...описал тут = http://www.prog.org.ru/topic_15739_0.html
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Ноябрь 18, 2010, 12:20 »

Я разобрался в чем проблема мне нужен поток который будет подчищять удаленые итемы со сцены.
Это как "потушить пожар бензином"  Улыбающийся

Если есть непонятки с удалением, перекройте деструктор удаляемого (если он еще не перекрыт), поставьте там точку останова и смотрите где и как его удаляют.  И пользуйтесь тегом для оформления кода, иначе читать Ваши посты неудобно.
Записан
ufna
Гость
« Ответ #20 : Ноябрь 18, 2010, 17:11 »

Жуть О_о это даже хлеще чем тушить пожар бензином

Может все-таки сделаешь проект с ошибкой или выложишь исходники целиком?
Записан
MuLLIKA
Гость
« Ответ #21 : Ноябрь 19, 2010, 18:41 »

Все сделал. суть в том что, есть итем(QGraphicsItem) который рисует полигон с катринкой генератора, есть класс generator, который создаетьбся вместе с этим итемом, итем добавляеться на сцену. Уэтого итема можно вызвать контекстное меню, его вызов прописан в классе итема (класс переписан мной), есть 2 значения меню "Удалить" и "Изменить параметры", так вот при удалени у еня итем просто убирался со сцены (removeItem(item)), а память выделенная под класс итема и класс генератора не освобождалась!Т.е. при добавлении других устройств на сцену занимаемая память становилась все больше и больше, а при удалении не освобождалась, поэтому утекала.
Нужно было сделать так что бы где удалялся родитель этих 2х классов, но проблема была в том то где сделать удаление родителя! потому что сама реализация контекстного меню была описанаа в классе генератора, т.е. при нажатии на итем на сцене шла обработка нажатия в классе итем, и вызывалось меню собранное в классе генератора, т.е. при удалении генератора нужно было сделать деилт родителя, но из класса генератора или из класса итема нельзя удалить родителя, потому что при удалении он удаляет своих "сыновей" (как Вы мне сказали, я это проверил), а это значит при удалении родителя допустим из класса генератора родитель удалит ЭТОТ класс генератора и выполнение программы не будет знать куда возвращаться после команды делит родителя, ибо указатель на класс в которой вызывался делит уже освобожден.
Об этом говорит вот это строка:
Код:
inline T *data() const
    {
        return d;
    }
Решил эту проблему через запуск потока в начале программы, который следит за удалением родителя этих 2х классов, того объекта который удаляют со сцены.
Спасибо, за помощь!
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.