|
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 17
|
|||||||||||
Необходимость в использовании виртуальных деструкторов и их правильное использование19.10.2016, 23:01. Показов 2709. Ответов 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
|
|||||||
|
Вездепух
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,235
|
|||||||||
| 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
|
||
|
Вездепух
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,235
|
|||
| 20.10.2016, 18:22 | |||
предок *, указывающие на потомка. То есть при использовании delete виртуальные деструкторы будут нужны.Прощу прощения за то, что ввел в заблуждение. В первом примере просто нет delete (утечка памяти), то есть деструкторы "не нужны", но если устранить утечку, то они понадобятся. Во втором примере виртуальные деструкторы сразу нужны.Добавлено через 4 минуты new и delete, а, скажем так, "временнОе" их количество. То есть каждое выполнение new-выражения во временнОй последовательности выполнения шагов программы должно иметь соответствующее ему выполнение delete-выражения.Понятно, конечно, что с "визуальной" точки зрения количество new может не соответствовать количеству delete, так как и первые и последние могут быть завернуты в функции.
1
|
|||
| 20.10.2016, 18:22 | |
|
Помогаю со студенческими работами здесь
12
Использование конструкторов и деструкторов
Возможности модификации программы при использовании виртуальных методов Простая прога на использование конструкторов и деструкторов в с++ не работает ( не пойму почему ( Использование полей подстановок, необходимость и правильность Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|