А когда может не вызываться деструктор?
От: Аноним  
Дата: 23.01.13 17:48
Оценка:
Помогите новичку!
Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?
Re: А когда может не вызываться деструктор?
От: Piko  
Дата: 23.01.13 17:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Помогите новичку!

А>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?

когда конструктор не отработал до конца т.е. вылетело исключение — деструкторы вызываются только для полностью созданных объектов.
Re: А когда может не вызываться деструктор?
От: rg45 СССР  
Дата: 23.01.13 18:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Помогите новичку!

А>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?

1. Когда бросается исключение, которое нигде не ловится.

2. (MSVC specific) при возникновении SEH исключений в приложении, в котором один из модулей (бросающий или перехватывающий это исключение) скомпилирован с выключенной опцией /EHa
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: А когда может не вызываться деструктор?
От: Nikita.Trophimov  
Дата: 23.01.13 18:49
Оценка: +1
R>1. Когда бросается исключение, которое нигде не ловится.

Это unspecified.
Re: А когда может не вызываться деструктор?
От: Nikita.Trophimov  
Дата: 23.01.13 18:50
Оценка:
Например, в случае использования longjmp.
Re: А когда может не вызываться деструктор?
От: Кодт Россия  
Дата: 23.01.13 19:17
Оценка: 19 (2) +1
Здравствуйте, Аноним, Вы писали:

А>Помогите новичку!

А>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?

А в связи с чем вопрос?
Ну, там
— на собеседовании спросили
— обнаружен баг
— обнаружено странное поведение
— нужно добиться такого поведения
и т.д.

А то можно всякого навыдумывать.
Любое завершение потока или процесса, не сопровождающееся раскруткой стека. То есть, terminate(), abort(), exit(), ExitThread(), TerminateThread(), SEH, signal...
Любой прыжок в коде. longjmp(), повреждение стека, указателя на функцию, указателя на таблицу виртуальных функций, с последующим переходом в чёрт знает куда.
Потеря информации о типе. delete (NonvirtualBase*) new Derived(), повреждение указателя на таблицу виртуальных функций (например, вместо присваивания сделали memcpy базового класса — подменили vfptr наследника на базовый).
Нарушение защиты памяти, повреждение секций кода или констант (таблицы виртуальных функций).
И прочая, и прочая, и прочая.
Перекуём баги на фичи!
Re[3]: А когда может не вызываться деструктор?
От: rg45 СССР  
Дата: 23.01.13 19:31
Оценка:
Здравствуйте, Nikita.Trophimov, Вы писали:

R>>1. Когда бросается исключение, которое нигде не ловится.


NT>Это unspecified.


Вопрос был, "когда может...". А в этом случае может.
--
Справедливость выше закона. А человечность выше справедливости.
Re: А когда может не вызываться деструктор?
От: vitcpp Россия http://vdavydov.ru
Дата: 23.01.13 21:30
Оценка: 1 (1) +1 -1
А>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?

Классический пример — отсутствие виртуального деструктора — http://cpp-reference.ru/articles/virtual-destructor/
Re[2]: А когда может не вызываться деструктор?
От: sts  
Дата: 25.01.13 12:37
Оценка:
Здравствуйте, vitcpp, Вы писали:

А>>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?


V>Классический пример — отсутствие виртуального деструктора — http://cpp-reference.ru/articles/virtual-destructor/


Это UB
Re[2]: А когда может не вызываться деструктор?
От: Abyx Россия  
Дата: 25.01.13 13:13
Оценка: -3 :)
Здравствуйте, vitcpp, Вы писали:

V>Классический пример — отсутствие виртуального деструктора — http://cpp-reference.ru/articles/virtual-destructor/


В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.


это же чушь.
где Вы нашли этот говносайт?
In Zen We Trust
Re[4]: А когда может не вызываться деструктор?
От: Abyx Россия  
Дата: 25.01.13 13:14
Оценка: -4
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Nikita.Trophimov, Вы писали:


R>>>1. Когда бросается исключение, которое нигде не ловится.


NT>>Это unspecified.


R>Вопрос был, "когда может...". А в этом случае может.


в нормальных компиляторах не может.
In Zen We Trust
Re[3]: А когда может не вызываться деструктор?
От: sts  
Дата: 25.01.13 13:18
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, vitcpp, Вы писали:


V>>Классический пример — отсутствие виртуального деструктора — http://cpp-reference.ru/articles/virtual-destructor/


A>

A>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.


A>это же чушь.

A>где Вы нашли этот говносайт?

А что тут не так ?
Вроде как удаление через указатель на базовый с невиртуальным деструктором = UB (по стандарту 2003, а как по новому интересно ?)
Re[5]: А когда может не вызываться деструктор?
От: rg45 СССР  
Дата: 25.01.13 13:32
Оценка:
Здравствуйте, Abyx, Вы писали:

R>>>>1. Когда бросается исключение, которое нигде не ловится.


NT>>>Это unspecified.


R>>Вопрос был, "когда может...". А в этом случае может.


A>в нормальных компиляторах не может.


К сожалению, ТС ничего не сообщил о степени нормальности своего компилятора. Кроме того, раз стандарт допускает такое поведение, значит оно может иметь место в любых компиляторах.
--
Справедливость выше закона. А человечность выше справедливости.
Re[4]: А когда может не вызываться деструктор?
От: Abyx Россия  
Дата: 25.01.13 13:39
Оценка: -1
Здравствуйте, sts, Вы писали:

V>>>Классический пример — отсутствие виртуального деструктора — http://cpp-reference.ru/articles/virtual-destructor/


A>>

A>>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.


A>>это же чушь.

A>>где Вы нашли этот говносайт?

sts>А что тут не так ?

деструктор полиморфного базового класса может быть каким угодно.

sts>Вроде как удаление через указатель на базовый с невиртуальным деструктором = UB (по стандарту 2003, а как по новому интересно ?)

вызов delete — UB, но это же не единственный способ разрушить объект
In Zen We Trust
Re[3]: А когда может не вызываться деструктор?
От: vitcpp Россия http://vdavydov.ru
Дата: 25.01.13 13:40
Оценка:
A>

A>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.


A>это же чушь.

A>где Вы нашли этот говносайт?
Почему чушь? Обоснуйте.
Re[3]: А когда может не вызываться деструктор?
От: rg45 СССР  
Дата: 25.01.13 13:42
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, vitcpp, Вы писали:


V>>Классический пример — отсутствие виртуального деструктора — http://cpp-reference.ru/articles/virtual-destructor/


A>

A>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.


A>это же чушь.


Это высказывание является прямым следствием из 5.3.5/3.

A>где Вы нашли этот говносайт?


А с сайтом что не так?
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: А когда может не вызываться деструктор?
От: vitcpp Россия http://vdavydov.ru
Дата: 25.01.13 13:42
Оценка: :)
V>>Классический пример — отсутствие виртуального деструктора — http://cpp-reference.ru/articles/virtual-destructor/
sts>Это UB

UB или не UB, но вопросом по поводу виртуального деструктора отсекали соискателей еще по телефонному собеседованию лет 5 еще назад.
Re[4]: А когда может не вызываться деструктор?
От: Abyx Россия  
Дата: 25.01.13 13:47
Оценка: -1
Здравствуйте, vitcpp, Вы писали:

V>Почему чушь? Обоснуйте.


http://rsdn.ru/forum/cpp/5044673.1
Автор: Abyx
Дата: 25.01.13
In Zen We Trust
Re[4]: А когда может не вызываться деструктор?
От: Abyx Россия  
Дата: 25.01.13 13:52
Оценка: +1
Здравствуйте, rg45, Вы писали:

A>>

A>>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.


A>>это же чушь.


R>Это высказывание является прямым следствием из 5.3.5/3.

это не может быть следствием, т.к. `delete pointer-to-base-type;` это не единственный способ корректно разрушить объект через указатель на его базовый класс.

R>А с сайтом что не так?

то что на нем такие статьи
In Zen We Trust
Re[5]: А когда может не вызываться деструктор?
От: vitcpp Россия http://vdavydov.ru
Дата: 25.01.13 13:57
Оценка:
V>>Почему чушь? Обоснуйте.
A>http://rsdn.ru/forum/cpp/5044673.1
Автор: Abyx
Дата: 25.01.13


Это все понятно. Полагаю, вы слишком формально подходите к статье, и вас смутило слово "должен". Но по сути, описано хорошее правило делать деструктор виртуальным в случае полиморфных типов. Можно использовать обычный деструктор, если вы точно уверены, как именно ваша иерархия классов будет использоваться или в целях оптимизации.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.