Russian Qt Forum
Ноябрь 22, 2024, 22:15
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Как вызываются деструкторы
Страниц:
1
[
2
]
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как вызываются деструкторы (Прочитано 18040 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как вызываются деструкторы
«
Ответ #15 :
Декабрь 19, 2020, 09:52 »
Цитата: tux от Декабрь 18, 2020, 11:43
Деструктор вызовется далеко не всегда.
Цитировать
Косинус.. ну он не всегда < 1. Может быть и равен 2. В войну до 5 доходил - и ничего, работали
Записан
juvf
Программист
Offline
Сообщений: 570
Re: Как вызываются деструкторы
«
Ответ #16 :
Январь 13, 2021, 12:13 »
Цитата: AK от Декабрь 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?
1) Конструктор и деструктор в с++ никогда не вызывается явным видом. Забудьте про всякие S.~QString();. Конструктор и деструктор (а также копирующий конструктор) вызываются автоматически при создании и удалении объекта. Это по мойму азбука с++ (да и вообще ооп).
2) Если вы разбераетесь в программировании, например знаете СИ, и хотите освоить С++ (и ООП) - читайте книгу
"Философия с++" Брюс Эккель
. Самая лучшая книга по освоению с++/ооп. Описано доступным языком, с примерами и задачами для закрепления знаний. Там и поиграетесь qDebug-ом в деструкторах/конструктора и поймёте что, когда и как вызывается. Пока не прочитаете, так и будете плавать в понятиях конструктор/деструктор/стек/куча/статически....
«
Последнее редактирование: Январь 13, 2021, 12:17 от juvf
»
Записан
AK
Новичок
Offline
Сообщений: 14
Re: Как вызываются деструкторы
«
Ответ #17 :
Январь 20, 2021, 07:28 »
Спасибо большое, буду читать Эккеля! Пока подобрал себе Дейтел "Как программировать на C++", изучаю!
Записан
AK
Новичок
Offline
Сообщений: 14
Re: Как вызываются деструкторы
«
Ответ #18 :
Январь 20, 2021, 07:32 »
Цитата: Igors от Декабрь 18, 2020, 07:36
Не вижу примера прямого вызова деструктора. А какой был порыв любознательности, желания все изучить! И сразу потух, и куда все делось?
Igors, спасибо за заботу! Удрученный собственным невежеством и обрадованный небольшим его уменьшением удалился изучать матчасть
Вон народ книжек посоветовал, изучаю. Пока на вашу задачку не знаю ответа
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Как вызываются деструкторы
«
Ответ #19 :
Январь 20, 2021, 13:42 »
Цитата: juvf от Январь 13, 2021, 12:13
1) Конструктор и деструктор в с++ никогда не вызывается явным видом. Забудьте про всякие S.~QString();. Конструктор и деструктор (а также копирующий конструктор) вызываются автоматически при создании и удалении объекта. Это по мойму азбука с++ (да и вообще ооп).
Вот не надо так человека в заблуждение вводить по поводу конструкторов
Любой вызов типа X* x = new X(QObject* parent) вызывает в первую очередь непосредственно конструктор X::X(QObject* parent).
И только те, которые не указаны прямо после X::X(): будут вызваны неявно "по цепочке" в очерёдности наследования.
А если при создании Х не указаны параметры, то вызовется конструктор по умолчанию (который обычно создаётся компилятором автоматически, если не указан явно).
«
Последнее редактирование: Январь 21, 2021, 12:45 от Racheengel
»
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как вызываются деструкторы
«
Ответ #20 :
Январь 20, 2021, 16:50 »
Цитата: AK от Январь 20, 2021, 07:32
..удалился изучать матчасть
Вон народ книжек посоветовал, изучаю.
Да фигня все это чтение
Не, ну я иногда делаю (слабые) попытки, но .. Во-первых продравшись через обильное предисловие и кучу благодарностей - я уже устал и растерял добрую половину энтузиазма. Дальше идет то что, в общем, мне известно и чем я и так занимаюсь весь день. Конечно, автор знает это лучше меня, возможно и есть чему у него поучиться, но разрывать "жемчужные зерна" в этой куче - это невыносимо
Или жуется пример на богомерзкой жабе, что не лучше. Частенько ловлю себя на мыслях типа: "а это чтение имеет какую-то конкретную цель?". "А оно как-то контролируется?". Спросите у любителя "философии" сколько упражнений из книги он выполнил? В общем, достигается в основном самоудовлетворенность типа "я умный потому что я "читал"! Но это не всегда так
Записан
juvf
Программист
Offline
Сообщений: 570
Re: Как вызываются деструкторы
«
Ответ #21 :
Апрель 05, 2021, 10:34 »
Цитата: Igors от Январь 20, 2021, 16:50
Спросите у любителя "философии" сколько упражнений из книги он выполнил?
Все до одного упражнения. Потом и 2-ой том "прошел".
Цитировать
Во-первых продравшись через обильное предисловие и кучу благодарностей - я уже устал и растерял добрую половину энтузиазма.
не интересно, так не читайте это. я титры фильма тоже не читаю.
Цитировать
Дальше идет то что, в общем, мне известно и чем я и так занимаюсь весь день.
Так зачем она вам? Повторюсь
специально для Вас
Цитировать
2) Если вы разберетесь в программировании, например знаете СИ, и
хотите освоить С++ (и ООП)
- читайте книгу "Философия с++" Брюс Эккель.
Ключевое слово -
хотите освоить
. Если Вы
закончили школу/вуз
уже освоили
с++,
то учить счет от 1 до 10 и 2*2 Вам будет неинтересно и бесполезно
то изучать определение конструктора Вам будет неинтересно и бесполезно.
Эта книга книга дает именно тот недостающий (и для кого-то тяжелый) шаг чтобы перейти от си к с++ и к опп. Если Вы этот шаг сделали - то удачи Вам в проф.деятельности.
Цитировать
Любой вызов типа X* x = new X(QObject* parent) вызывает в первую очередь непосредственно конструктор X::X(QObject* parent).
Где тут явный вызов конструктора?
Например есть определение метода QDir QDir::current(). Его можно в коде вызвать явно
QDir dir = QDir::current(); //вот это я называю явным вызовом.
X* x = new X(QObject* parent); - где тут явная запись
X::X
(... )? Такой код даже не соберётся.
вот такой соберётся:
QObject* parent;
X* x = new X(parent);
Создается переменная x в куче типа Х с аргументом QObject *parent. Вывозится соответствующий конструктор, хотя ни какого явного вызова типа Х::Х(...) нет. Причем, конструктор может быть объявлен, например так
X::X(QObject* parent, QObject* child = 0, int base = 10);
Упс.... вызывали "явно" new X(
QObject*
parent), а вызвался X::X(QObject* parent, QObject* child, int base);
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как вызываются деструкторы
«
Ответ #22 :
Апрель 05, 2021, 10:51 »
Цитата: juvf от Апрель 05, 2021, 10:34
Если Вы
закончили школу/вуз
уже освоили
с++,
Вуз закончил задолго до рождения С++, наверно поэтому еще не освоил
Цитата: juvf от Апрель 05, 2021, 10:34
QDir dir = QDir::current(); //вот это я называю явным вызовом.
Может "философия" и ничего, но во всяком случае Вы делаете ей анти-рекламу
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Как вызываются деструкторы
«
Ответ #23 :
Апрель 05, 2021, 11:02 »
Цитата: Igors от Апрель 05, 2021, 10:51
Вуз закончил задолго до рождения С++, наверно поэтому еще не освоил
С++ появился в 1983 году. Задолго до... это какой 1973? Вы 1950 года рождения? Или просто свистанул для пафоса?
Записан
juvf
Программист
Offline
Сообщений: 570
Re: Как вызываются деструкторы
«
Ответ #24 :
Апрель 05, 2021, 12:07 »
Цитата: Igors от Апрель 05, 2021, 10:51
Вуз закончил задолго до рождения С++, наверно поэтому еще не освоил
какая взаимосвязь между ВУЗ-ом и с++?
Учитесь читать
не читайте перечеркнутый текст. Его для того и перечеркнули, что бы не читать. .... эх..... если вы отделить зачеркнутое от не зачеркнутого не можете, то специально для вас перефразирую...
Цитировать
Если Вы
закончили школу/вуз
уже освоили с++,
то учить счет от 1 до 10 и 2*2 Вам будет неинтересно и бесполезно
то изучать определение конструктора Вам будет неинтересно и бесполезно.
Если Вы
научились считать и умножать, то учить счет от 1 до 10 Вам будет неинтересно и бесполезно, ровно как и если Вы
уже освоили с++, то изучать определение конструктора Вам будет неинтересно и бесполезно.
ps не читайте зачеркнутый текст
Записан
sergek
Гипер активный житель
Offline
Сообщений: 872
Мы должны приносить пользу людям.
Re: Как вызываются деструкторы
«
Ответ #25 :
Апрель 05, 2021, 12:10 »
Цитата: Old от Апрель 05, 2021, 11:02
С++ появился в 1983 году. Задолго до... это какой 1973? Вы 1950 года рождения? Или просто свистанул для пафоса?
Хм... 1983 - в лучшем случае, это EC-1022/24, PL и Фортран. До первых персоналок с Quick C, Borland Turbo Pascal и C еще столько лет... Может, и не свистит?
Записан
Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как вызываются деструкторы
«
Ответ #26 :
Апрель 05, 2021, 13:02 »
Цитата: sergek от Апрель 05, 2021, 12:10
Хм... 1983 - в лучшем случае, это EC-1022/24, PL и Фортран. До первых персоналок с Quick C, Borland Turbo Pascal и C еще столько лет... Может, и не свистит?
Все так, сначала работал на 1022, потом на 1052 "по центру", любил эту машину.
С образованием совсем хреново. Тогда считалось что программирование - дело чисто женское, а мужик должен бегать с паяльником. Курс программирования назывался АЯИП и никаким авторитетом не пользовался. Один раз лектор пришел с яйцами (лотком). Почему-то это задело. Пичкали транзисторами, их я всегда тихо ненавидел. Ну тогда это тоже была "современная технология"
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Как вызываются деструкторы
«
Ответ #27 :
Апрель 05, 2021, 13:22 »
Цитата: sergek от Апрель 05, 2021, 12:10
Хм... 1983 - в лучшем случае, это EC-1022/24, PL и Фортран. До первых персоналок с Quick C, Borland Turbo Pascal и C еще столько лет... Может, и не свистит?
Ну так это называется "Вуз закончил задолго до того как познакомился с C++", а не "Вуз закончил задолго до рождения С++".
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Как вызываются деструкторы
«
Ответ #28 :
Апрель 15, 2021, 12:59 »
Цитата: Old от Апрель 05, 2021, 13:22
Ну так это называется "Вуз закончил задолго до того как познакомился с C++", а не "Вуз закончил задолго до рождения С++".
Когда я учился, плюсы уже появились, только у нас его не преподавали почему-то. Чистый С был, Паскаль и дофига ассемблеров разных.
А транзисторы я тоже ненавидел (как и пол-потока
)
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
sergek
Гипер активный житель
Offline
Сообщений: 872
Мы должны приносить пользу людям.
Re: Как вызываются деструкторы
«
Ответ #29 :
Апрель 15, 2021, 17:35 »
Цитата: Racheengel от Апрель 15, 2021, 12:59
А транзисторы я тоже ненавидел (как и пол-потока
)
Все-таки пол-потока были правильными студентами
Может, это они Эльбрус сейчас делают? Но точно не те, которые из кубиков домики собирают...
Записан
Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц:
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...