Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему вызывается деструктор? 
:(
    Опции темы
cppGhost
Дата 27.7.2016, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.4.2013

Репутация: нет
Всего: нет



Доброго времени суток. Написал такой код:
Код

struct O
{
    virtual ~O()
    {    
        cout << "hey";
    }
};

struct Ex : public O
{
    Ex()
    {    
    }

    ~Ex()
    {
        throw(1);
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        Ex obj;            
    }        
    catch(int err)
    {
    }    
    
    return 0;
}

как мне казалось, вызов исключения в деструкторе производного класса, должен вызвать ситуацию, когда деструктор базового класса вызван не будет.
однако,  "hey" пишется. MSVS 2008. 

Это сообщение отредактировал(а) cppGhost - 27.7.2016, 20:04
PM MAIL   Вверх
cppGhost
Дата 27.7.2016, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.4.2013

Репутация: нет
Всего: нет



Блин. Я совсем ничего не понимаю. Загнал этот код в онлайн компилятор. Если поставить стандарт 98, то деструктор вызывается. Если х11 или х14, то не вызывается.
Что там такое поменялось то?)
PM MAIL   Вверх
DarthTon
Дата 28.7.2016, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: нет
Всего: 6



В 11 стандарте деструкторы сделали noexcept по-умолчанию. Что б код вел себя как 98 стандарт, надо добавить  noexcept(false) к деструкторам. Но это не тот случай всё равно, дестурктор базового класса быдует вызыван при раскрутке стека во время обработки исключения.
PM MAIL   Вверх
cppGhost
Дата 28.7.2016, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.4.2013

Репутация: нет
Всего: нет



Ну почему же он должен быть вызван? По выходу из области видимости разрушается переменная obj  и вызывается её деструктор. Сначала деструктор класса Ex, после которого должен быть вызван деструктор класса O. Но вызывается исключение деструктор O не должен вызываться! Или что именно я путаю?
PM MAIL   Вверх
cppGhost
Дата 28.7.2016, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.4.2013

Репутация: нет
Всего: нет



Мне тут немного объяснили еще. Получается, что вызов необработанного исключения в деструкторе в 11ом стандарте и выше сразу приводит к terminate. А в 98ом стандарте есть пункт типа
Цитата

An object of any storage duration whose initialization or destruction is terminated by an exception will have destructors executed for all of its fully constructed subobjects (excluding the variant members of a union-like class), that is, for subobjects for which the principal constructor (12.6.2) has completed execution and the destructor has not yet begun execution.

поэтому в 98ом деструктор базового класса и вызывается
PM MAIL   Вверх
Starikan
Дата 30.9.2016, 01:20 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.10.2007

Репутация: нет
Всего: -15



в масстве попиши, тогда по атрибутам вызыавться будет и скомпилируется нормально

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0824 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.