Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Конструктор и исключительная ситуация  (Прочитано 10946 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 21-09-2010 14:55 » 

Правильно ли это, что обьект (test) класса Class1, как показано в примере ниже, не будет создан?
Код:
class SomeException {};

class Class1
{
public:
        Class1()
        {
                this->function1();
        }

        void function1()
        {
                throw SomeException();
        }
};

int main(int argc, char** argv)
{
        try
        {
                Class1 test;
        }
        catch(...) { return 1; }

        return 0;
}
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #1 : 21-09-2010 15:07 » 

Извините, я немного не так спросил.
После "получения" исключительной ситуации SomeException будет ли продолжать выполняться код в конструкторе, который следует за "this->function();"? (У меня в примере ничего за вызовом функции нету, но такое возможно)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 21-09-2010 16:58 » 

Dr.Y, будет создан. Но, видим и живёт он только внутри блока
Код:
        {
                Class1 test;
        }
по выходу из блока объект уже разрушен

Код в конструкторе после кидания исключения не будет продолжаться, так как ты его там не перехватил. Продолжится в catch

Всё это, кстати, легко проверяется отладчиком (ещё добавь деструктор в класс)
« Последнее редактирование: 21-09-2010 17:00 от Алексей1153++ » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 21-09-2010 21:10 » 

Если в конструкторе класса произошло исключение и оно не было там отловлено, то экземпляр класса не создается. При этом деструктор класса не вызывается. Следовательно нужно быть с этим осторожным. Переменные, которые ранее были успешно созданы динамически в хеше, не будут уничтожены. Следовательно будет происходить течь.
« Последнее редактирование: 21-09-2010 21:14 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 22-09-2010 03:17 » 

Finch, ну да, ты прав - деструктор не вызвался. Но и утечки нету, однако )
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 22-09-2010 04:57 » 

Алексей1153++, а если так:
Код:
#include <memory>

class SomeException {};

class Class1
{
private:
    int* array; // ну, например
    std::auto_ptr<int> array2; // или так
public:
        Class1()
        : array(new int[1024])  // ну, например
        , array2(new int[1024]) // или так
        {
                this->function1();
        }

        void function1()
        {
                throw SomeException();
        }
};
« Последнее редактирование: 22-09-2010 05:00 от Вад » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 22-09-2010 05:30 » 

Вад, а про new не было в условии.
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 22-09-2010 08:20 » 

Извините, я немного не так спросил.
После "получения" исключительной ситуации SomeException будет ли продолжать выполняться код в конструкторе, который следует за "this->function();"? (У меня в примере ничего за вызовом функции нету, но такое возможно)

Если исключение произошло в function(), то дальнейший код выполняться не будет.
« Последнее редактирование: 22-09-2010 08:21 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 22-09-2010 12:27 » 

Finch, ну да, ты прав - деструктор не вызвался. Но и утечки нету, однако )
Леш, поэтому то я и подчеркнул

Переменные, которые ранее были успешно созданы динамически в хеше, не будут уничтожены. Следовательно будет происходить течь.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #9 : 23-09-2010 04:26 » new

Переменные, которые ранее были успешно созданы динамически в хеше, не будут уничтожены.

только не в хеше Улыбаюсь а в куче
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines