|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
Почему деструктор срабатывает больше раз, чем количество созданных объектов?18.01.2017, 16:35. Показов 10860. Ответов 111
Метки нет (Все метки)
Вопрос в заголовке темы. Почему? Создается всего 2 объекта, но деструктор вызывается трижды.
Вот пример
Ещё интересует вот что. Если описать деструктор, нужно ли описывать ещё и деструктор по умолчанию? Если нет, то каким образом происходит освобождение памяти, которое было занято для объекта (речь о простых типах)
0
|
||||||
| 18.01.2017, 16:35 | |
|
Ответы с готовыми решениями:
111
Можно ли обеспечить взаимодействие программно созданных объектов и объектов, созданных мастером
Почему у двух созданных объектов одинаковые имена |
|
Форумчанин
8217 / 5048 / 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
|
|
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,316
|
||
| 18.01.2017, 20:39 | ||
operator delete). Симметричным образом выглядит и ситуация с конструкторами, так что ничего специфичного именно для деструкторов тут нет.
1
|
||
|
2083 / 1576 / 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
|
|
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,316
|
|||||||||||||
| 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
|
||
|
Форумчанин
8217 / 5048 / 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
|
|
|
Форумчанин
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||
| 18.01.2017, 22:05 | |||
|
Это где-то указано? Добавлено через 6 минут Впрочем, вы итак всё это поймёте, поэкспериментировав с написанием пользовательского оператора new для класса.
1
|
|||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 18.01.2017, 22:16 | ||
|
А если с указателями на члены данных или на самого себя в подобъектах... То в подавляющем большинстве случаев это говорит о концептуальной кривокостыльности некоторых решений ошибочно считаемых синтаксическим сахаром (например не нативных свойств). Так же в прочем не менее кривая идея хранить подобные объекты в однотипном массиве не допускающем динамического полиморфизма а не хранить массив указателей на них. В любом случае копирование через конструкторы существенно снижает производительность соответственно стоило бы иметь как минимум два типа контейнеров на эту тему (либо средства управления политикой копирования), при этом при внесении в стандарт нативных свойств использование контейнеров с копированием через деструкторы/конструкторы было бы в районе 0% случаев.
0
|
||
|
Неэпический
|
||||
| 18.01.2017, 23:20 | ||||
![]()
0
|
||||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 18.01.2017, 23:24 | ||
|
0
|
||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||
| 19.01.2017, 00:18 | ||||
|
Добавлено через 5 минут Не по теме:
Добавлено через 17 минут
0
|
||||
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,316
|
|||
| 19.01.2017, 00:20 | |||
|
0
|
|||
| 19.01.2017, 00:20 | |
|
Монета брошена 800 раз. Найти вероятность того, что «герб» выпадет на 20 раз больше, чем решка Используя статическую компоненту класса подсчитать количество созданных в программе объектов Почему событие срабатывает несколько раз Почему таймер срабатывает несколько раз? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|