![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
такой код:
http://liveworkspace.org/code/5bdbe54ebc9f...831474f53d46993 успешно компилятся. но не ясным становится вопрос, что выполняет дефолтный деструктор? с дефолтным конструктором все понятно. Это сообщение отредактировал(а) boostcoder - 28.11.2011, 18:16 |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
а что их несколько, деструкторов? Это сообщение отредактировал(а) Alca - 28.11.2011, 18:28 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
вызывает по-очереди деструкторы всех членов класса. нет ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а вот гораздо интереснее, на мой взгляд ![]()
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
нет. их вызов обеспечивает компилятор. кстати, если деструктор не дефолтный, деструкторы не вызываются штоли? http://codepad.org/Uj0iCGWy ничего особенного. компилятор не может вызвать деструктор, т.к. класс недоопределен. это, кстати, известная проблема: вроде бы работа происходит только с указателями, однако вызов delete требует описание класса. именно из-за необходимости вызова деструктора. Добавлено через 2 минуты и 14 секунд зато http://codepad.org/bdTI0l1y ;-) |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
g++ 4.1.2 -std=c++98 не компилирует, говорит incomplete type вообще ввиду того что интерфейс деструктора неизменен, и он есть всегда, можно было бы решить этот вопрос на стадии линковки, однако стандарт определяет по-другому.
видимо тут дело в возможном наличии нестандартного operator delete(), и хотя явно к деструктору не относится, результат тот, что мы имеем |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
||||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Если у структуры/класса нет полей, требующих вызова деструктора и нет виртуального деструктора - его вызов - ничего не делать.
Если есть виртуальный деструктор - его вызов - найти vtable (нужно знать смещение), найти в ней указатель на деструктор (опять же, нужно знать смещение) - код вызова разный. И только если деструктор не виртуальный и не пустой, будет вызов одинаковый. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
я видимо не совсем понятно выразился. в силу 5.3.5.5 компилятор может оптимизировать вызов деструктора, помещая поиск в vtable за его пределы. так обычно и сделано, и Вы правы. в случае недоопределенного класса компилятор либо ругается либо не вызывает деструктор (возможно, с предупреждением об этом).
я же имел в виду, что технически поиск в по vtable можно встроить в деструктор, ссылка на который разрешалась бы во время линковки. так и было бы сделано, если отменить 5.3.5.5. правда, в этом случае оптимизация была бы затруднена, но это проблема разработчиков компиляторов)) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |