Здравствуйте, Аноним, Вы писали:
А>Помогите новичку! А>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?
когда конструктор не отработал до конца т.е. вылетело исключение — деструкторы вызываются только для полностью созданных объектов.
Здравствуйте, Аноним, Вы писали:
А>Помогите новичку! А>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?
1. Когда бросается исключение, которое нигде не ловится.
2. (MSVC specific) при возникновении SEH исключений в приложении, в котором один из модулей (бросающий или перехватывающий это исключение) скомпилирован с выключенной опцией /EHa
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Аноним, Вы писали:
А>Помогите новичку! А>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?
А в связи с чем вопрос?
Ну, там
— на собеседовании спросили
— обнаружен баг
— обнаружено странное поведение
— нужно добиться такого поведения
и т.д.
А то можно всякого навыдумывать.
Любое завершение потока или процесса, не сопровождающееся раскруткой стека. То есть, terminate(), abort(), exit(), ExitThread(), TerminateThread(), SEH, signal...
Любой прыжок в коде. longjmp(), повреждение стека, указателя на функцию, указателя на таблицу виртуальных функций, с последующим переходом в чёрт знает куда.
Потеря информации о типе. delete (NonvirtualBase*) new Derived(), повреждение указателя на таблицу виртуальных функций (например, вместо присваивания сделали memcpy базового класса — подменили vfptr наследника на базовый).
Нарушение защиты памяти, повреждение секций кода или констант (таблицы виртуальных функций).
И прочая, и прочая, и прочая.
Здравствуйте, vitcpp, Вы писали:
А>>Какие могут быть ситуации, когда не вызывается дестуктор(сделал new и не сделал delete не в счет)?
V>Классический пример — отсутствие виртуального деструктора — http://cpp-reference.ru/articles/virtual-destructor/
В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Nikita.Trophimov, Вы писали:
R>>>1. Когда бросается исключение, которое нигде не ловится.
NT>>Это unspecified.
R>Вопрос был, "когда может...". А в этом случае может.
A>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.
A>это же чушь. A>где Вы нашли этот говносайт?
А что тут не так ?
Вроде как удаление через указатель на базовый с невиртуальным деструктором = UB (по стандарту 2003, а как по новому интересно ?)
Здравствуйте, Abyx, Вы писали:
R>>>>1. Когда бросается исключение, которое нигде не ловится.
NT>>>Это unspecified.
R>>Вопрос был, "когда может...". А в этом случае может.
A>в нормальных компиляторах не может.
К сожалению, ТС ничего не сообщил о степени нормальности своего компилятора. Кроме того, раз стандарт допускает такое поведение, значит оно может иметь место в любых компиляторах.
--
Справедливость выше закона. А человечность выше справедливости.
A>>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.
A>>это же чушь. A>>где Вы нашли этот говносайт?
sts>А что тут не так ?
деструктор полиморфного базового класса может быть каким угодно.
sts>Вроде как удаление через указатель на базовый с невиртуальным деструктором = UB (по стандарту 2003, а как по новому интересно ?)
вызов delete — UB, но это же не единственный способ разрушить объект
A>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.
A>это же чушь. A>где Вы нашли этот говносайт?
Почему чушь? Обоснуйте.
A>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.
A>это же чушь.
Это высказывание является прямым следствием из 5.3.5/3.
A>где Вы нашли этот говносайт?
А с сайтом что не так?
--
Справедливость выше закона. А человечность выше справедливости.
A>>В языке программирования C++ деструктор полиморфного базового класса должен объявляться виртуальным.
A>>Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.
A>>это же чушь.
R>Это высказывание является прямым следствием из 5.3.5/3.
это не может быть следствием, т.к. `delete pointer-to-base-type;` это не единственный способ корректно разрушить объект через указатель на его базовый класс.
R>А с сайтом что не так?
то что на нем такие статьи
Это все понятно. Полагаю, вы слишком формально подходите к статье, и вас смутило слово "должен". Но по сути, описано хорошее правило делать деструктор виртуальным в случае полиморфных типов. Можно использовать обычный деструктор, если вы точно уверены, как именно ваша иерархия классов будет использоваться или в целях оптимизации.