|
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 17
|
|||||||||||
Необходимость в использовании виртуальных деструкторов и их правильное использование19.10.2016, 23:01. Показов 2661. Ответов 11
Метки нет (Все метки)
Добрый вечер, у меня несколько вопросов по виртуальным деструкторам.
1) В данном примере не используются виртуальные деструкторы, правильно ли это? По идее динамическая память тут не выделяется поэтому можно обойтись без деструкторов, но в аналогичном примере из моего второго вопроса (класс Brain) виртуальные деструкторы почему-то используются. Где правильно? И в каких случаях действительно нужны виртуальные деструкторы?
2) У базового класса есть виртуальный деструктор virtual ~Brain(), у первого наследника вирт. деструктор ~Legs() плюс в конце высвобождается память с помощью delete legs; аналогично со вторым наслеником - ~Eyes() и delete eyes. Виртуальный деструктор нужен, чтобы при удалении объекта удалялась не только часть класса наследника, но и базового. В связи с чем вопрос, нужно ли в конце писать delete brain? И почему?
0
|
|||||||||||
| 19.10.2016, 23:01 | |
|
Ответы с готовыми решениями:
11
Правильное использование конструкторов и деструкторов использование деструкторов Использование конструторов и деструкторов |
|
Комп_Оратор)
|
|||||||
| 19.10.2016, 23:59 | |||||||
|
Дело в том что деструктор базового будет вызван в любом случае, а виртуальный деструктор будет вызван именно для того чем наследник отличился. От батька. В Вашем случае это имеет смысл как учебный тест - посмотреть сообщения, их порядок вывода. Потому что они действительно ничего не освобождают тут. Хуже другое. Виртуальные методы бессмысленны и беспощадны. Лучше было бы определить в базовом метод
)тогда в наследниках legs протянут ноги, а eyes вытаращат глазья. То есть при вызове self_test через указатели базового класса Вам не нужно будет знать что именно и кто вызывает. Вы будете уверены, что вот тот кто вызывает, так он уж вызовет именно то что ему надо. То есть вытаращенных ног и вытянутых глаз не случится. Во всяком случае не должно. А указатели надо освобождать (вернее их память). Там и деструкторы вызовутся вдобавок. Хотя main и так всё уничтожит, но для порядку - вызывайте. Причина та же что и у любых указателей на динамическую память: надо.
0
|
|||||||
|
Вездепух
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
|
|||||||||
| 20.10.2016, 00:41 | |||||||||
Сообщение было отмечено Croessmah как решение
Решениеdelete) объект-наследник через указатель на его базу.
Ни в одном из ваших вариантов такого удаления нет. Поэтому формально нигде вам виртуальный деструктор не нужен. Другое дело, что в ваших примерах присутствуют утечки памяти, потому что вы вообще не удаляете некоторые объекты. Но к виртуальным деструкторам эта тема отношения не имеет, по крайней мере пока. delete должно быть равно количеству new: сколько создали, столько и удаляем.
5
|
|||||||||
|
Комп_Оратор)
|
||
| 20.10.2016, 10:48 | ||
|
Я написал то, что написал не для проявления глубины знаний. Её и нет если честно. Я пытался объяснить ситуацию в терминах ТС. Так как то что он пытается сказать, свидетельствует о том, что термины ему знакомы, а ситуация (модель в которой они работают) непонятна. Судя по его молчанию, он не переварил сказанного мною. Сказанного Вами и подавно. Или занят очень. В любом случае, Ваше замечание верно и я благодарен Вам за помощь. Спасибо.
0
|
||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
| 20.10.2016, 12:07 | |
|
0
|
|
|
Ушел с форума
|
||
| 20.10.2016, 12:30 | ||
|
удаление), у предка должен быть (MUST HAVE!!!) виртуальный деструктор. Нарушение этого требования ведет к неопределенному поведению - UB. Очень правильно TheCalligrapher написал выше - не должно и не может быть никаких предположений или объяснений на этот счет, даже если программа успешно компилируется и на этапе выполнения не вылезает никаких ошибок. Это все до поры. Легко можно привести реальный, не надуманный, пример, когда нарушение этого правила ведет к аварийному завершению работы программы на большинстве популярных компиляторов.
3
|
||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 20.10.2016, 12:38 | |
|
MrGluck, нету поправочки - смарт-указатели инкапсулируют delete
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 20.10.2016, 12:42 | |||||||
4
|
|||||||
|
Комп_Оратор)
|
||
| 20.10.2016, 13:16 | ||
Сообщение было отмечено Croessmah как решение
Решение![]() Более того. Знакомясь с концепцией мне, например, вначале важно ответить на вопросы: в чём смысл? какая задача решается?, какова цель? Это всё один вопрос. Иначе я просто не смогу учить. Конечно, нельзя опережать события слишком. Посмотрите как ТС применил виртуальное наследование. Оно бессмысленно. И пока он не поймёт как оно работает, работу виртуального метода "деструктор" объяснить невозможно. Но объяснить можно на языке близком к его языку. А говоря точно, нужно либо главами писать, либо сформулировать "вещь в себе" которых полно в книгах и которую разберёшь когда их перечитаешь. Тут есть дилемма. Я не призываю опускаться до мычания и сюсюкания, но некоторая мера условности оправдана. Всё к чему мы прикасаемся требует многократного возвращения и уточнения. То есть, если судьба, то человек к этому ещё вернётся.
0
|
||
|
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 17
|
||||||||
| 20.10.2016, 14:52 [ТС] | ||||||||
|
По поводу delete и утечек памяти - разобрался, это код с обучающего сайта и при ознакомлении с ним возник когнитивный диссонанс.
Вы написали следующее:
0
|
||||||||
|
Комп_Оратор)
|
||
| 20.10.2016, 17:51 | ||
|
cofo, посмотрите совет про self_test и переделайте код. Посмотрите что получилось. Тогда Вы поймёте как вызывается виртуальный деструктор на указателе базового класса.
0
|
||
|
Вездепух
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
|
|||
| 20.10.2016, 18:22 | |||
предок *, указывающие на потомка. То есть при использовании delete виртуальные деструкторы будут нужны.Прощу прощения за то, что ввел в заблуждение. В первом примере просто нет delete (утечка памяти), то есть деструкторы "не нужны", но если устранить утечку, то они понадобятся. Во втором примере виртуальные деструкторы сразу нужны.Добавлено через 4 минуты new и delete, а, скажем так, "временнОе" их количество. То есть каждое выполнение new-выражения во временнОй последовательности выполнения шагов программы должно иметь соответствующее ему выполнение delete-выражения.Понятно, конечно, что с "визуальной" точки зрения количество new может не соответствовать количеству delete, так как и первые и последние могут быть завернуты в функции.
1
|
|||
| 20.10.2016, 18:22 | |
|
Помогаю со студенческими работами здесь
12
Использование конструкторов и деструкторов
Возможности модификации программы при использовании виртуальных методов Простая прога на использование конструкторов и деструкторов в с++ не работает ( не пойму почему ( Использование полей подстановок, необходимость и правильность Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Рецензия / Мнение/ Перевод
https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs
. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|