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

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

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

Доброго все здравия! У меня в программе много классов, у каждого из них есть свой деструктор в отором я описал удаление переменных из "кучи" (delete perem;)

Вопрос такой, почему при удалении переменной класса который описан мной, т.е переменная не стандартного класса Qt (допустим QComboBox *box;) компилятор выдает очень много предупреждений(waraning)

После того как я описал деструкторы по закрытию моей программы дебаггер выкидывает такую ошибку

inline QString::~QString() { if (!d->ref.deref()) free(d); }

Invalid Address specified to RtlFreeHeap( 003E0000, 6A2902C7 )

Буду очень признателен за помощь!
Зарание спасибо!
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Ноябрь 13, 2010, 08:25 »

Код в студию.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ufna
Гость
« Ответ #2 : Ноябрь 13, 2010, 10:54 »

у меня есть подозрение что ты создаешь объект как

box = new QComboBox(this),

а потом для этого this создаешь деструктор, где убиваешь box ручками?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Ноябрь 13, 2010, 11:29 »

ufna, у тебя сегодня libastral.so собралась?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
« Ответ #4 : Ноябрь 13, 2010, 13:48 »

у меня есть подозрение что ты создаешь объект как

box = new QComboBox(this),

а потом для этого this создаешь деструктор, где убиваешь box ручками?
Ну и что в этом плохого?
Записан
MuLLIKA
Гость
« Ответ #5 : Ноябрь 13, 2010, 14:56 »

ufna, да именно так! а в чем здесь может быть проблема?

Пантер, код оч много. А пример выделения памяти для переменной и ее удаление ufna написал.
Записан
MuLLIKA
Гость
« Ответ #6 : Ноябрь 13, 2010, 15:14 »

Вот такой деструктор
mainW::~mainW()
{
    //delete pTree;
    delete tool;
    //delete scene;
    //delete view;
    delete pix;
    delete device_but;
    delete cables_device;
    delete pButGr;
    //delete vw;
    delete mainMenu;
    delete StartSignal;
    delete exitProgram;
    delete StatusL;
    delete StatusL2;
    delete StatusL3;
    delete wgt;
    delete itemCables;
    delete itemWid;
    delete itemKT4;
    delete itemClear;
    delete but;
    delete widget;
}

на  delete pix; выкидывает ошибку

Объявление в h файле
private:
    QToolBox *tool;
    QGraphicsPixmapItem *pix;
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Ноябрь 13, 2010, 15:20 »

Покажи как создаешь pix.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
MuLLIKA
Гость
« Ответ #8 : Ноябрь 13, 2010, 15:26 »

Разобрался!

~mainW()
{
    if(!pix) delete pix;
}
я проверил, оказываеться что pix доходя до деструктора уже удалена(видимо автоматически), потому что ручками я не прописывал ничего
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Ноябрь 13, 2010, 15:38 »

Не всегда сработает. Т.к. pix может быть удален, но указатель не занулен.
Кто у него родитель?
И да, если назначаешь родителя, то удалять вручную не нужно, родитель сам это сделает.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ufna
Гость
« Ответ #10 : Ноябрь 13, 2010, 16:11 »

Ну и что в этом плохого?

Ну это уже к Qt, а не ко мне. Как минимум пример выше "что в этом плохого".
Записан
ufna
Гость
« Ответ #11 : Ноябрь 13, 2010, 16:12 »

ufna, у тебя сегодня libastral.so собралась?

давно уже основной инструмент. Предсказываю даже будущее.
Записан
BRE
Гость
« Ответ #12 : Ноябрь 13, 2010, 16:21 »

Ну это уже к Qt, а не ко мне. Как минимум пример выше "что в этом плохого".
В Qt можно спокойно использовать delete для уничтожения объектов, даже если при их создании указывался parent.
Главное повторно не удалять уже удаленные объекты. Что кстати и показывает пример выше. Внимательно посмотри на код:
Код
C++ (Qt)
~mainW()
{
   if(!pix) delete pix; // Если pix == 0, вызываем delete 0; :)
}
 
Записан
ufna
Гость
« Ответ #13 : Ноябрь 14, 2010, 16:45 »

BRE, дак я по-моему и не говорил, что удалять их нельзя Улыбающийся Я говорил о том, что если нет необходимости удалять вручную и делаются вещи из разряда if(!pix) - то лучше отдать бразды правления Qt, правильно указывая родителей. К примеру при работе с сетевым менеджером можно легко прийти к косяку, где delete вручную будет вызывать падение Улыбающийся Ну и самое место "граблей" будет в том, что частенько родители сменяются динамически при работе, к примеру айтемы, при добавлении в список и т.п. - и их удаление из "создающего" виджета тотальное - по-моему будет не айс. Вполне возможно здесь именно такая ситуация.

Ну а так то я совсем не против ручного delete и так далее Улыбающийся
Записан
MuLLIKA
Гость
« Ответ #14 : Ноябрь 15, 2010, 03:20 »

Спасибо мужики! но у меня возникла еще одна проблема. При удалении объекта со сцены мне бы хотелось освободить память которая выделилась на создание этого объекта. До сего момента у меня объект просто удалялся со сцены removeItem(..)
внутри самого объекта осуществдяеться удаление со сцены, а сейчас (может глупо) после удаления со сцены я делаю  delete this, вызывается деструктор, удаляються переменные и потом он выкидывает ошибку сегментации показывая на
inline T *data() const
    {
        return d;
    }

походу передать выполнеение программы куда не знает.
Пробовал из класса сцены делать делит объекта, но происходит та же штука.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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