|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
Почему деструктор срабатывает больше раз, чем количество созданных объектов?18.01.2017, 16:35. Показов 10207. Ответов 111
Метки нет (Все метки)
Вопрос в заголовке темы. Почему? Создается всего 2 объекта, но деструктор вызывается трижды.
Вот пример
Ещё интересует вот что. Если описать деструктор, нужно ли описывать ещё и деструктор по умолчанию? Если нет, то каким образом происходит освобождение памяти, которое было занято для объекта (речь о простых типах)
0
|
||||||
| 18.01.2017, 16:35 | |
|
Ответы с готовыми решениями:
111
Можно ли обеспечить взаимодействие программно созданных объектов и объектов, созданных мастером
Почему у двух созданных объектов одинаковые имена |
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||
| 18.01.2017, 20:24 | ||
|
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 18.01.2017, 20:26 [ТС] | |
|
Croessmah,
Вы так и не ответили на мой вопрос по поводу noexcept ![]() Добавлено через 1 минуту MrGluck, Значит происходит невидимое наследование функционала деструктора по умолчанию?)))
0
|
|
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
||
| 18.01.2017, 20:39 | ||
operator delete). Симметричным образом выглядит и ситуация с конструкторами, так что ничего специфичного именно для деструкторов тут нет.
1
|
||
|
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 18.01.2017, 20:41 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 18.01.2017, 20:43 [ТС] | |
|
TheCalligrapher,
Т.е говоря про operator delete вы имеете ввиду что деструктор по умолчанию может сам освободить сырую память? Откуда он знает может эта память нам все еще нужна?
0
|
|
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
|||||||||||||
| 18.01.2017, 20:50 | |||||||||||||
|
В общем случае, разумеется, внутреннее состояние объекта запросто может зависеть от того, по какому адресу он располагается в памяти. Добавлено через 6 минут --- В языке С++ абстрактный алгоритм работы оператора delete сводится к последовательности из двух шагов: 1. Вызов правильного деструктора объекта 2. Вызов правильной функции освобождения "сырой" памяти operator delete(void *).Функция operator delete(void *), как известно, может замещаться/перегружаться пользователем. Разрешается как замещать глобальный ::operator delete(void *), так и перегружать статическую функцию operator delete(void *) в конкретных классах. При этом спецификация языка требует, чтобы выбор конкретного operator delete(void *) делался так, как будто его поиск (name lookup) делался из деструктора удаляемого объекта.Например
delete pb после выполнения деструктора B::~B должен вызваться B::operator delete, а при выполнении delete pd после выполнения деструктора D::~D должен вызваться D::operator delete. Другими словами, несмотря на то, что функция operator delete всегда является статическим членом класса, она должна вести себя фактически как виртуальная (!) функция.Для того, чтобы удовлетворить этому требованию языка, большинство реализаций просто-напросто переносят вызов правильного operator delete внутрь деструктора. Таким образом требуемая "виртуальность" функции operator delete достигается бесплатно, за счет виртуальности деструктора.При этом понятно, что operator delete(void *) нужно вызвать только для полных объектов, размещенных в динамической памяти, а для остальных объектов - не нужно (т.е. нельзя). Чтобы принять это во внимание, компиляторы снабжают деструктор неявным булевским параметром, говорящим деструктору, надо ли вызывать operator delete. Таким образом в вышеприведенном примере деструкторы на самом деле будут иметь следующий вид
delete pb и delete pd в такой ситуации превращаются просто в виртуальные вызовы pb->~B(true) и pd->~B(true). Первое попадает в B::~B, второе - в D::~D. Компилятор GCC, кстати, в более ранних версиях реализовывал этот подход именно так, как описано выше - через скрытый булевский параметр, а в современных версиях этот же поход он реализует через генерацию двух отдельных деструкторов.
4
|
|||||||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 18.01.2017, 21:07 [ТС] | |
|
TheCalligrapher,
Постараюсь разобрать ваш пост, спасибо. А есть актуальные книжки на русском которые помогут хорошо разбираться в таких деталях?
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 18.01.2017, 21:13 [ТС] | |
|
TheCalligrapher,
Разобрался)
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 18.01.2017, 21:22 | ||
|
компилятор сам автоматом генерит код запуска деструкторов данных-членов. тобишь, сначала отработает тело явно определенного деструктора. а затем - код прибивания детишек
1
|
||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||
| 18.01.2017, 21:48 | ||
|
SO - это же не форум даже, а платформа вопрос-ответ.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 18.01.2017, 21:55 | |
|
0
|
|
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||
| 18.01.2017, 22:05 | |||
|
Это где-то указано? Добавлено через 6 минут Впрочем, вы итак всё это поймёте, поэкспериментировав с написанием пользовательского оператора new для класса.
1
|
|||
|
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 18.01.2017, 22:16 | ||
|
А если с указателями на члены данных или на самого себя в подобъектах... То в подавляющем большинстве случаев это говорит о концептуальной кривокостыльности некоторых решений ошибочно считаемых синтаксическим сахаром (например не нативных свойств). Так же в прочем не менее кривая идея хранить подобные объекты в однотипном массиве не допускающем динамического полиморфизма а не хранить массив указателей на них. В любом случае копирование через конструкторы существенно снижает производительность соответственно стоило бы иметь как минимум два типа контейнеров на эту тему (либо средства управления политикой копирования), при этом при внесении в стандарт нативных свойств использование контейнеров с копированием через деструкторы/конструкторы было бы в районе 0% случаев.
0
|
||
|
Неэпический
|
||||
| 18.01.2017, 23:20 | ||||
![]()
0
|
||||
|
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 18.01.2017, 23:24 | ||
|
0
|
||
|
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||
| 19.01.2017, 00:18 | ||||
|
Добавлено через 5 минут Не по теме:
Добавлено через 17 минут
0
|
||||
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
|||
| 19.01.2017, 00:20 | |||
|
0
|
|||
| 19.01.2017, 00:20 | |
|
Помогаю со студенческими работами здесь
60
Монета брошена 800 раз. Найти вероятность того, что «герб» выпадет на 20 раз больше, чем решка Используя статическую компоненту класса подсчитать количество созданных в программе объектов Почему событие срабатывает несколько раз Почему таймер срабатывает несколько раз? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|