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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Как вызываются деструкторы  (Прочитано 16085 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Декабрь 19, 2020, 09:52 »

Деструктор вызовется далеко не всегда.
Цитировать
Косинус.. ну он не всегда < 1. Может быть и равен 2. В войну до 5 доходил - и ничего, работали
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #16 : Январь 13, 2021, 12:13 »

Уважаемые специалисты, я, увы, новичок в 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 Offline

Сообщений: 14


Просмотр профиля
« Ответ #17 : Январь 20, 2021, 07:28 »

Спасибо большое, буду читать Эккеля!  Пока подобрал себе Дейтел "Как программировать на C++", изучаю! 
Записан
AK
Новичок

Offline Offline

Сообщений: 14


Просмотр профиля
« Ответ #18 : Январь 20, 2021, 07:32 »

Не вижу примера прямого вызова деструктора. А какой был порыв любознательности, желания все изучить! И сразу потух, и куда все делось?  Улыбающийся
Igors, спасибо за заботу! Удрученный собственным невежеством и обрадованный небольшим его уменьшением удалился изучать матчасть Улыбающийся Вон народ книжек посоветовал, изучаю. Пока на вашу задачку не знаю ответа
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #19 : Январь 20, 2021, 13:42 »

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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Январь 20, 2021, 16:50 »

..удалился изучать матчасть Улыбающийся Вон народ книжек посоветовал, изучаю.
Да фигня все это чтение Улыбающийся Не, ну я иногда делаю (слабые) попытки, но .. Во-первых продравшись через обильное предисловие и кучу благодарностей - я уже устал и растерял добрую половину энтузиазма. Дальше идет то что, в общем, мне известно и чем я и так занимаюсь весь день. Конечно, автор знает это лучше меня, возможно и есть  чему у него поучиться, но разрывать "жемчужные зерна" в этой куче - это невыносимо  Плачущий Или жуется пример на богомерзкой жабе, что не лучше. Частенько ловлю себя на мыслях типа: "а это чтение имеет какую-то конкретную цель?". "А оно как-то контролируется?". Спросите у любителя "философии" сколько упражнений из книги он выполнил? В общем, достигается в основном самоудовлетворенность типа "я умный потому что я "читал"! Но это не всегда так Улыбающийся
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #21 : Апрель 05, 2021, 10:34 »

Спросите у любителя "философии" сколько упражнений из книги он выполнил?
Все до одного упражнения. Потом и 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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Апрель 05, 2021, 10:51 »

Если Вы закончили школу/вуз уже освоили с++,
Вуз закончил задолго до рождения С++, наверно поэтому еще не освоил  Улыбающийся

QDir dir = QDir::current(); //вот это я называю явным вызовом.
Может "философия" и ничего, но во всяком случае Вы делаете ей анти-рекламу  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #23 : Апрель 05, 2021, 11:02 »

Вуз закончил задолго до рождения С++, наверно поэтому еще не освоил  Улыбающийся
С++ появился в 1983 году. Задолго до... это какой 1973? Вы 1950 года рождения? Или просто свистанул для пафоса? Улыбающийся
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #24 : Апрель 05, 2021, 12:07 »

Вуз закончил задолго до рождения С++, наверно поэтому еще не освоил  Улыбающийся
какая взаимосвязь между ВУЗ-ом и с++? Учитесь читать не читайте перечеркнутый текст. Его для того и перечеркнули, что бы не читать. .... эх..... если вы отделить зачеркнутое от не зачеркнутого не можете, то специально для вас перефразирую...
Цитировать
Если Вы закончили школу/вуз уже освоили с++, то учить счет от 1 до 10 и 2*2 Вам будет неинтересно и бесполезно  то изучать определение конструктора Вам будет неинтересно и бесполезно.
Если Вы научились считать и умножать, то учить счет от 1 до 10 Вам будет неинтересно и бесполезно, ровно как и если Вы уже освоили с++, то изучать определение конструктора Вам будет неинтересно и бесполезно.

ps не читайте зачеркнутый текст
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #25 : Апрель 05, 2021, 12:10 »

С++ появился в 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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Апрель 05, 2021, 13:02 »

Хм... 1983 - в лучшем случае, это EC-1022/24, PL и Фортран. До первых персоналок с Quick C, Borland Turbo Pascal и C еще столько лет... Может, и не свистит?  Подмигивающий
Все так, сначала работал на 1022, потом на 1052 "по центру", любил эту машину.

С образованием совсем хреново. Тогда считалось что программирование - дело чисто женское, а мужик должен бегать с паяльником. Курс программирования назывался  АЯИП и никаким авторитетом не пользовался. Один раз лектор пришел с яйцами (лотком). Почему-то это задело. Пичкали транзисторами, их я всегда тихо ненавидел. Ну тогда это тоже была "современная технология"
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #27 : Апрель 05, 2021, 13:22 »

Хм... 1983 - в лучшем случае, это EC-1022/24, PL и Фортран. До первых персоналок с Quick C, Borland Turbo Pascal и C еще столько лет... Может, и не свистит?  Подмигивающий
Ну так это называется "Вуз закончил задолго до того как познакомился с C++", а не "Вуз закончил задолго до рождения С++". Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #28 : Апрель 15, 2021, 12:59 »

Ну так это называется "Вуз закончил задолго до того как познакомился с 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 Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #29 : Апрель 15, 2021, 17:35 »

А транзисторы я тоже ненавидел (как и пол-потока Улыбающийся )
Все-таки пол-потока были правильными студентами Подмигивающий Может, это они Эльбрус сейчас делают? Но точно не те, которые из кубиков домики собирают...
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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