Russian Qt Forum
Апреля 03, 2025, 05:51
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Как вызываются деструкторы
Страниц: [
1
]
2
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как вызываются деструкторы (Прочитано 18927 раз)
AK
Новичок
Offline
Сообщений: 14
Как вызываются деструкторы
«
:
Декабря 15, 2020, 11:22 »
Уважаемые специалисты, я, увы, новичок в C++ и Qt вопрос, как следует вызывать деструкторы
1. Правильно ли я понимаю, что динамически-созданные объекты классов, наследующих QObject, всегда уничтожаются Qt автоматически? Т.е. явно вызывать "delete S;" после "QString S; S = new QString("Abc");..." не нужно?
2. Если я создаю статически, скажем "QString S = "Abc";" как поле класса, то должен в деструкторе класса обязательно написать "S.~QString();" ?
3. Если я объявил "QString S = "Abc";", как локальную переменную метода, то деструктор можно не вызывать, так как объект S будет размещен в стеке и память выделенная S будет освобождена после завершения выполнения метода?
4. Во всех примерах создания оконных приложений:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow winMain;
winMain.show();
return app.exec();
}
Объект MainWindow создается статически, получается, его деструктор не будет вызван никогда?
Тогда если полями MainWindow у меня являются динамические массивы, то единственная возможность их удались перед завершением работы приложения - написать слот для сигнала aboutToQuit() QApplication?
«
Последнее редактирование: Декабря 15, 2020, 11:33 от AK
»
Записан
ssoft
Программист
Offline
Сообщений: 584
Re: Как вызываются деструкторы
«
Ответ #1 :
Декабря 15, 2020, 12:19 »
Здесь собственно отвечать не на что. По каждому вопросу нужно отправлять учить основы C++.
1. Нет, не правильно. См.
https://doc.qt.io/qt-5/objecttrees.html
2. Нет, не правильно. Что значит
статически
и что такое деструктор, когда он вызывается и нужно ли его вызывать явно?
3. То же самое. Читайте про область видимости переменных и порядок их инициализации и удаления.
4. Тоже полная ерунда написана. Следует из непонимания 2 и 3.
«
Последнее редактирование: Декабря 15, 2020, 12:23 от ssoft
»
Записан
AK
Новичок
Offline
Сообщений: 14
Re: Как вызываются деструкторы
«
Ответ #2 :
Декабря 15, 2020, 12:48 »
Я вот и пытаюсь учить, книжки читаю, но вопросы остаются.
1. Спасибо по п. 1 вроде понял: при удалении родителя все дочерние объекты будут также удалены.
2. Частично понятно из п.1. Про "статически" снялся вопрос. Но в основном непонятно. Я представляю себе так: я создал объект QString s="Abc" Где-то в памяти, наверное, в куче, размещено "Abc". Перед закрытием программы следует очистить память. Для этого нужно явно или неявно вызвать деструктор. QString не является наследником другого объекта QObject (п.1), поэтому следует вызвать деструктор явно. Правильно ли я рассуждаю?
3. Из того, что читал следует, что переменные могут размещаться в отдельном сегменте данных (глобальные переменные), время жизни = времени жизни программы, в стеке (локальные переменные функций и методов) время жизни = времени выполнения функции/метода, в куче там время жизни - пока явно не удалю. Если объект объявлен в методе, он - локальная переменная, все, что его касается, хранится в стеке, правда, он может выделить память в куче. Опять же нужно явно вызывать деструктор получается?
4. Ну да, я не понимаю ни основы C++ ни специфику Qt, пытаюсь разобраться, в книжках ответы не нашел, потому и спрашиваю
По моей логике (порочной судя по брезгливому комментарию) надо явно вызвать деструктор MainWindow, в котором освободить всю выделенную под массивы в куче память и вызвать деструкторы всех созданных объектов. Но такой деструктор в изученных мной примерах никто не делает. Очевидно, я где-то не прав, но не понимаю где.
«
Последнее редактирование: Декабря 15, 2020, 12:50 от AK
»
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5877
Жаждущий знаний
Re: Как вызываются деструкторы
«
Ответ #3 :
Декабря 15, 2020, 12:56 »
У тебя MainWindow создается не статически, а на стеке, он будет автоматически разрушен (с вызовом деструктора) при выходе из функции main. При разрушении экземпляра класса все его не динамические члены так же разрушаются.
«
Последнее редактирование: Декабря 15, 2020, 13:29 от Пантер
»
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
AK
Новичок
Offline
Сообщений: 14
Re: Как вызываются деструкторы
«
Ответ #4 :
Декабря 15, 2020, 13:26 »
Ааа, Пантер, спасибо большое!
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как вызываются деструкторы
«
Ответ #5 :
Декабря 15, 2020, 14:07 »
Возможно лучше пожевать что-то одно, напр
Цитата: AK от Декабря 15, 2020, 11:22
3. Если я объявил "QString S = "Abc";", как локальную переменную метода, то деструктор можно не вызывать, так как объект S будет размещен в стеке и память выделенная S будет освобождена после завершения выполнения метода?
Сам по себе S - указатель (грубо говоря), да, размещен в стеке. А вот "Abc" (что может быть очень большим) объект S разместит в куче. При выходе из области видимости S c ним самим ничего не происходит, просто занимаемая этим указателем память будет доступна для использования, и, вероятно, скоро кeм-то будет занята. Но до того автоматычно вызовется деструктор, он освободит "Abc" в куче.
Отсюда следует что "деструктор можно не вызывать" - неверно, здесь правильно "деструктор нельзя вызывать" т.к. это поведет к повторному удалению "Abc" и крашу (в лучшем случае)
Есть простое утверждение типа "деструктор никогда не должен вызываться напрямую", и оно, в общем, верно. Редкие исключения подтверждают это правило. Если хотите изучить "но совесть" - приведите такой редкий пример
Записан
AK
Новичок
Offline
Сообщений: 14
Re: Как вызываются деструкторы
«
Ответ #6 :
Декабря 15, 2020, 14:31 »
Igors, спасибо!! Очень полезное обсуждение. Прямо чувствую, как умнею!
Записан
AK
Новичок
Offline
Сообщений: 14
Re: Как вызываются деструкторы
«
Ответ #7 :
Декабря 15, 2020, 14:32 »
Буду думать над редким примером
Записан
AK
Новичок
Offline
Сообщений: 14
Re: Как вызываются деструкторы
«
Ответ #8 :
Декабря 15, 2020, 14:40 »
В каком-то смысле, явного деструктора требуют динамически создаваемые объекты, он при вызове delete вызывается, на сколько я понимаю. Далее надо думать..
Записан
AK
Новичок
Offline
Сообщений: 14
Re: Как вызываются деструкторы
«
Ответ #9 :
Декабря 15, 2020, 14:42 »
Видимо, если объявить объект, как глобальную переменную, а не на стеке, то для него придется явно вызвать деструктор
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Как вызываются деструкторы
«
Ответ #10 :
Декабря 15, 2020, 14:52 »
нет
https://en.cppreference.com/w/cpp/language/storage_duration
Цитировать
static storage duration. The storage for the object is allocated when the program begins and deallocated when
the program ends
.
Only one instance of the object exists.
All objects declared at namespace scope (including
global namespace
) have this storage duration, plus those declared with
static
or extern.
See Non-local variables and Static local variables for details on initialization of objects with this storage duration.
«
Последнее редактирование: Декабря 15, 2020, 14:54 от Авварон
»
Записан
AK
Новичок
Offline
Сообщений: 14
Re: Как вызываются деструкторы
«
Ответ #11 :
Декабря 15, 2020, 15:14 »
То есть все статические объекты: объявленные явно как static, либо объявленные вне функций будут уничтожены с вызовом деструктора при завершении программы? В ссылке про вызов деструктора не написано явно, но видимо, так.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как вызываются деструкторы
«
Ответ #12 :
Декабря 18, 2020, 07:36 »
Не вижу примера прямого вызова деструктора. А какой был порыв любознательности, желания все изучить! И сразу потух, и куда все делось?
Записан
tux
Global Moderator
Бывалый
Offline
Сообщений: 405
Re: Как вызываются деструкторы
«
Ответ #13 :
Декабря 18, 2020, 11:43 »
Деструктор вызовется далеко не всегда. Можно просто вставить тот же qDebug в саму функцию деструктора и поиграться.
Записан
Digital Art
RedDog
Частый гость
Offline
Сообщений: 221
Re: Как вызываются деструкторы
«
Ответ #14 :
Декабря 18, 2020, 13:52 »
Цитата: tux от Декабря 18, 2020, 11:43
Деструктор вызовется далеко не всегда. Можно просто вставить тот же qDebug в саму функцию деструктора и поиграться.
Вот плавно подходим к первому вопросу собеседования "зачем нужен виртуальный деструктор"
Записан
Страниц: [
1
]
2
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...