Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.82
paramonies
0 / 0 / 0
Регистрация: 08.04.2010
Сообщений: 10
#1

Обработка исключений для new - C++

08.04.2010, 21:41. Просмотров 4883. Ответов 41
Метки нет (Все метки)

Всем привет!
Вопрос следующий. Когда функция new не может выделить память, то генериться исключение bad_alloc.
Допустим есть следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
     
       char* p;
       try
       {   for(int i = 0; i < 20; i++)
        {   p = new char[614400000U];
        cout <<  i << ":success of allocation " << endl;
        }
    }
    catch(bad_alloc)
    {    cout <<  "Allocation failure " << endl;
          abort();
    }
На каком то i шаге память закончится, сгенериться bad_alloc и мы попадем в блок catch()
А вот другой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
     
       char* p;
       try
       {   for(int i = 5; i > -5; i--)
        {   p = new char[i];
        cout <<  i << ":success of allocation " << endl;
        }
    }
    catch(bad_alloc)
    {    cout <<  "Allocation failure " << endl;
          abort();
    }
При отрицательном i, никакой обработки исключения не происходит, программа вываливается.
Вопрос: как в этом случае ведет себя new и как попасть в блок catch()?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2010, 21:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка исключений для new (C++):

Обработка исключений с пмощью структурированной обработки исключений - C++
Есть функция, которая определенным образом работает с файлами,но при работе с файлами &quot;не подходящего&quot; типа вызывается необработанное...

Обработка исключений в классах для пользовательских типов - C++
Здорова господа! Запустил токо класс String тестю и тут у меня вылетело исключение выход за пределы индекса, и программа тупо аварийно...

обработка исключений - C++
Есть вот такой код: #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv) { ...

Обработка исключений - C++
Объясните мне толком для чего используются эти обработки исключений (Try, catch, throw). Сколько не читаю, не могу понять для чего и как...

Обработка исключений - C++
Подскажите пожалуйста как продолжить выполнение программы после срабатывания оператора catch. catch завершает программу, но ее нужно...

Обработка исключений - C++
Почему не перехватывает ошибку и не выводит Error? а прога сама прекращает работу. #include &lt;iostream&gt; using namespace std; ...

41
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
08.04.2010, 21:52 #2
У меня срабатывает исключение такое же как и при положительном счетчике

Добавлено через 41 секунду
Код
0:success of allocation
1:success of allocation
2:success of allocation
Allocation failure
Код
0:success of allocation
-1:success of allocation
-2:success of allocation
Allocation failure
0
paramonies
0 / 0 / 0
Регистрация: 08.04.2010
Сообщений: 10
08.04.2010, 22:15  [ТС] #3
каким чудесным образом?)
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
08.04.2010, 22:17 #4
Цитата Сообщение от paramonies Посмотреть сообщение
каким чудесным образом?)
Я бы задал этот же вопрос, только наоборот)) каким чудесным образом она не работает у тебя? ))))..
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
08.04.2010, 22:21 #5
Если соблюдать правила хорошего тона можно обойтись и без исключений пример:
C++
1
2
3
4
5
6
7
int main(){
int *p = NULL;
p = new int(0);
if(p==NULL)return -1;
else delete p;
return 0;
}
Добавлено через 42 секунды

Не по теме:


Если бы все его соблюдали...

0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
08.04.2010, 22:23 #6
Вопрос то, как я понял не в обработке ошибок при выделении памяти, а именно в отрицательном счетчике
0
paramonies
0 / 0 / 0
Регистрация: 08.04.2010
Сообщений: 10
08.04.2010, 22:24  [ТС] #7
Ну просто по твоему результату видно, что new два раза выделил память под массивы с отрицательным числом элементов, почему не выделил третий раз, почему выскочило исключение тогда?
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
08.04.2010, 22:26 #8
Цитата Сообщение от paramonies Посмотреть сообщение
почему не выделил третий раз, почему выскочило исключение тогда?
Память не резиновая, после каждого вызова new необходимо делать вызов delete
C++
1
delete[] p;
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
08.04.2010, 22:29 #9
А вы не думаете, что дело в том, что отрицательное int неявно преобразуется в unsigned int, что дает очень большое число?
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
08.04.2010, 22:32 #10
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
А вы не думаете, что дело в том, что отрицательное int неявно преобразуется в unsigned int, что дает очень большое число?
А с чего бы ему преобразовываться?
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
08.04.2010, 22:38 #11
Цитата Сообщение от fasked Посмотреть сообщение
А с чего бы ему преобразовываться?
Может быть от того что оператор new принимает аргумент типа size_t, он же unsigned int?
1
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
08.04.2010, 22:40 #12
C++
1
2
3
4
5
6
7
8
9
10
11
 char* p;
       try
       {   for(int i = 5; i > -5; i--)
            {   p = new char[i];
                cout <<  i << ":success of allocation " << endl;
            }
        }
        catch(bad_alloc)
        {    cout <<  "Allocation failure " << endl;
              abort();
        }
Исключение генерируются когда происходит не хватка памяти, а не правильный
индекс для задания размера массива это извините кривые руки программиста.
1
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
08.04.2010, 22:43 #13
тьфу... точно... не досмотрел...
гляжу на первый пример с положительным счетчиком
C++
1
p = new char[614400000U];
автоматически думается, что с отрицательным полный аналог ))..
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
08.04.2010, 22:44 #14
fasked, ну вот, скорее всего в это дело и было.
0
ISergey
Maniac
Эксперт С++
1375 / 886 / 52
Регистрация: 02.01.2009
Сообщений: 2,661
Записей в блоге: 1
08.04.2010, 22:54 #15
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Если соблюдать правила хорошего тона можно обойтись и без исключений пример:
C++
1
2
3
4
5
6
7
int main(){
int *p = NULL;
p = new int(0);
if(p==NULL)return -1;
else delete p;
return 0;
}
И к чему это?..
оператор new генерирует исключение std::bad_alloc, тоесть

C++
1
2
Emploee *ptr = new Emploee; // генерирует исключение при нехватки памяти..
if(ptr == 0) ... // Мало вероятно что условие сработает когда либо...
Если охото чтобы new возвращал 0, делайте так..
C++
1
2
   char *ptr = new (nothrow) char; // Вернет 0 при нехватке памяти...
   if(ptr == 0){/*....*/}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2010, 22:54
Привет! Вот еще темы с ответами:

Обработка исключений - C++
класс B является производным от абстрактного класса А. Определить обработчик исключительной ситуации при преобразовании указателя на класс...

Обработка исключений - C++
Надо отловить ввод данных некорректного типа. Объясните пожалуйста на конкретном примере, как это правильно сделать. #include...

Обработка исключений - C++
Помогите написать программу пожалуйста!!!! Я незнаю как правильно написать!!! Задание: Для каждого варианта необходимо создать три...

Обработка исключений - C++
что то я не пойму а что в плюсах нельзя разве сделать что то типа: try { ... } catch (int) { ... }


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
08.04.2010, 22:54
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru