Russian Qt Forum
Ноябрь 24, 2024, 18:05
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Установка, сборка, отладка, тестирование
>
Ошибка удаления объекта класса
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Ошибка удаления объекта класса (Прочитано 12048 раз)
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
Сообщений: 5876
Жаждущий знаний
Re: Ошибка удаления объекта класса
«
Ответ #1 :
Ноябрь 13, 2010, 08:25 »
Код в студию.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ufna
Гость
Re: Ошибка удаления объекта класса
«
Ответ #2 :
Ноябрь 13, 2010, 10:54 »
у меня есть подозрение что ты создаешь объект как
box = new QComboBox(
this
),
а потом для этого this создаешь деструктор, где убиваешь box ручками?
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Ошибка удаления объекта класса
«
Ответ #3 :
Ноябрь 13, 2010, 11:29 »
ufna, у тебя сегодня libastral.so собралась?
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
Re: Ошибка удаления объекта класса
«
Ответ #4 :
Ноябрь 13, 2010, 13:48 »
Цитата: ufna от Ноябрь 13, 2010, 10:54
у меня есть подозрение что ты создаешь объект как
box = new QComboBox(
this
),
а потом для этого this создаешь деструктор, где убиваешь box ручками?
Ну и что в этом плохого?
Записан
MuLLIKA
Гость
Re: Ошибка удаления объекта класса
«
Ответ #5 :
Ноябрь 13, 2010, 14:56 »
ufna, да именно так! а в чем здесь может быть проблема?
Пантер, код оч много. А пример выделения памяти для переменной и ее удаление ufna написал.
Записан
MuLLIKA
Гость
Re: Ошибка удаления объекта класса
«
Ответ #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
Сообщений: 5876
Жаждущий знаний
Re: Ошибка удаления объекта класса
«
Ответ #7 :
Ноябрь 13, 2010, 15:20 »
Покажи как создаешь pix.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
MuLLIKA
Гость
Re: Ошибка удаления объекта класса
«
Ответ #8 :
Ноябрь 13, 2010, 15:26 »
Разобрался!
~mainW()
{
if(!pix) delete pix;
}
я проверил, оказываеться что pix доходя до деструктора уже удалена(видимо автоматически), потому что ручками я не прописывал ничего
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Ошибка удаления объекта класса
«
Ответ #9 :
Ноябрь 13, 2010, 15:38 »
Не всегда сработает. Т.к. pix может быть удален, но указатель не занулен.
Кто у него родитель?
И да, если назначаешь родителя, то удалять вручную не нужно, родитель сам это сделает.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ufna
Гость
Re: Ошибка удаления объекта класса
«
Ответ #10 :
Ноябрь 13, 2010, 16:11 »
Цитата: BRE от Ноябрь 13, 2010, 13:48
Ну и что в этом плохого?
Ну это уже к Qt, а не ко мне. Как минимум пример выше "что в этом плохого".
Записан
ufna
Гость
Re: Ошибка удаления объекта класса
«
Ответ #11 :
Ноябрь 13, 2010, 16:12 »
Цитата: Пантер от Ноябрь 13, 2010, 11:29
ufna, у тебя сегодня libastral.so собралась?
давно уже основной инструмент. Предсказываю даже будущее.
Записан
BRE
Гость
Re: Ошибка удаления объекта класса
«
Ответ #12 :
Ноябрь 13, 2010, 16:21 »
Цитата: ufna от Ноябрь 13, 2010, 16:11
Ну это уже к Qt, а не ко мне. Как минимум пример выше "что в этом плохого".
В Qt можно спокойно использовать delete для уничтожения объектов, даже если при их создании указывался parent.
Главное повторно не удалять уже удаленные объекты. Что кстати и показывает пример выше. Внимательно посмотри на код:
Код
C++ (Qt)
~mainW
(
)
{
if
(
!
pix
)
delete
pix
;
// Если pix == 0, вызываем delete 0; :)
}
Записан
ufna
Гость
Re: Ошибка удаления объекта класса
«
Ответ #13 :
Ноябрь 14, 2010, 16:45 »
BRE, дак я по-моему и не говорил, что удалять их нельзя
Я говорил о том, что если нет необходимости удалять вручную и делаются вещи из разряда if(!pix) - то лучше отдать бразды правления Qt, правильно указывая родителей. К примеру при работе с сетевым менеджером можно легко прийти к косяку, где delete вручную будет вызывать падение
Ну и самое место "граблей" будет в том, что частенько родители сменяются динамически при работе, к примеру айтемы, при добавлении в список и т.п. - и их удаление из "создающего" виджета тотальное - по-моему будет не айс. Вполне возможно здесь именно такая ситуация.
Ну а так то я совсем не против ручного delete и так далее
Записан
MuLLIKA
Гость
Re: Ошибка удаления объекта класса
«
Ответ #14 :
Ноябрь 15, 2010, 03:20 »
Спасибо мужики! но у меня возникла еще одна проблема. При удалении объекта со сцены мне бы хотелось освободить память которая выделилась на создание этого объекта. До сего момента у меня объект просто удалялся со сцены removeItem(..)
внутри самого объекта осуществдяеться удаление со сцены, а сейчас (может глупо) после удаления со сцены я делаю delete this, вызывается деструктор, удаляються переменные и потом он выкидывает ошибку сегментации показывая на
inline T *data() const
{
return d;
}
походу передать выполнеение программы куда не знает.
Пробовал из класса сцены делать делит объекта, но происходит та же штука.
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...