Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.82/33: Рейтинг темы: голосов - 33, средняя оценка - 4.82
Konstantin_D
14 / 14 / 6
Регистрация: 21.07.2011
Сообщений: 89
1

оператор new и исключение bad_alloc

21.02.2012, 19:00. Просмотров 5978. Ответов 22
Метки нет (Все метки)

Оператор new может генерировать исключение bad_alloc, определенное в заголовочном файле <new>.
Означает ли это, что в программу, использующую оператор new обязательно должен быть включен заголовочный файл <new> (#include <new>) ? И что произойдет если <new> не включить, а программа попытается сгенерировать исключение bad_alloc (т.е. создать объект класса bad_alloc) ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2012, 19:00
Ответы с готовыми решениями:

Исключение bad_alloc
Уже второй день сижу над ошибкой. За меня не нужно писать код, мне нужен просто...

Обработка исключений: проверить выделения памяти, используя исключение bad_alloc
Здравствуйте. Передо мной стоит задача: &quot;Проверьте выделения памяти новым...

Необработанное исключение в "0x76fd2eec" Microsoft C++: std::bad_alloc
Вот такая ошибка в VS2008, тогда как в 2013 все работает без проблем. Если...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc выделение памяти
Уважаемые форумчане! Работаю над программой обработки WAV файлов, но возникла...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Есть задача: Написать программу, которая считывает текст из файла и выводит его...

22
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
21.02.2012, 19:11 2
Компьютер взорвется.
а вообще
за этим проследит компилятор. Ну а раз он не выдает ошибок компиляции, значит это будет работать.
1
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
21.02.2012, 19:32 3
Нужно подключать.
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
21.02.2012, 19:47 4
Цитата Сообщение от go Посмотреть сообщение
Нужно подключать.
Что будет, если не подключить?
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
21.02.2012, 19:58 5
Цитата Сообщение от Chelioss Посмотреть сообщение
Что будет, если не подключить?
http://liveworkspace.org/code/961a2ca1fef0389ef52898c119935a54
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
21.02.2012, 20:02 6
Вообще-то ТС не про это писал.
0
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
21.02.2012, 20:09 7
можно так
1
Konstantin_D
14 / 14 / 6
Регистрация: 21.07.2011
Сообщений: 89
21.02.2012, 20:23  [ТС] 8
А если не перехватывать? Пусть программа завершается через terminate() и abort(). Как исключение может быть сгенерировано в принципе, если программа такого класса (bad_alloc) не знает (не включен <new>) ?
0
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,178
21.02.2012, 20:36 9
Konstantin_D, о нём знает стандартная библиотека, в которой и определено выделение памяти, этого вполне достаточно.
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
21.02.2012, 20:36 10
Цитата Сообщение от Konstantin_D Посмотреть сообщение
А если не перехватывать? Пусть программа завершается через terminate() и abort(). Как исключение может быть сгенерировано в принципе, если программа такого класса (bad_alloc) не знает (не включен <new>) ?
То, что <new> не подключен, не значит, что компилятор не знает о bad_alloc.
0
Evg
Эксперт CАвтор FAQ
19288 / 7147 / 528
Регистрация: 30.03.2009
Сообщений: 19,997
Записей в блоге: 30
21.02.2012, 21:00 11
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Означает ли это, что в программу, использующую оператор new обязательно должен быть включен заголовочный файл <new> (#include <new>) ?
Нет. Работе оператора new не зависит ни от каких подключаемых заголовочных файлов. Подключать его нужно НЕ для использования оператора new, а для того, чтобы перехватывать конкретно исключение bad_alloc. В посте #7 приведён пример, когда перехватываются, грубо говоря, все исключения (без детализации по конкретным типам), и там вполне себе обошлись без этого
1
Konstantin_D
14 / 14 / 6
Регистрация: 21.07.2011
Сообщений: 89
21.02.2012, 21:02  [ТС] 12
"Средства стандартной библиотеки определены в пространстве имен std и ПРЕДСТАВЛЕНЫ набором заголовочных файлов".
Из этого следует, что:
включили <vector> - знаем что это; не включили - не знаем!
Видимо, он (<new>) как-то сам цепляется.
А может его <iostream> подключает.
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
21.02.2012, 21:17 13
Цитата Сообщение от Konstantin_D Посмотреть сообщение
"Средства стандартной библиотеки определены в пространстве имен std и ПРЕДСТАВЛЕНЫ набором заголовочных файлов".
Из этого следует, что:
включили <vector> - знаем что это; не включили - не знаем!
Видимо, он (<new>) как-то сам цепляется.
А может его <iostream> подключает.
А ничего, что vector - это класс, а new - это оператор? Разницу видим?
0
Konstantin_D
14 / 14 / 6
Регистрация: 21.07.2011
Сообщений: 89
21.02.2012, 21:28  [ТС] 14
Я про bad_alloc. А он - класс!
Если не включили <new>, запросили много памяти, и не пытались
перехватить соответствующее исключение, то неперехваченное исключение
bad_alloc не прервет программу? (ведь класс bad_alloc не известен).
0
Evg
Эксперт CАвтор FAQ
19288 / 7147 / 528
Регистрация: 30.03.2009
Сообщений: 19,997
Записей в блоге: 30
21.02.2012, 21:30 15
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Видимо, он (<new>) как-то сам цепляется
Есть набор ключевых слов, которые являются элементами языка: if, for, while. Их компилятор понимает безо всяких подключений каких бы то ни было файлов. Точно так же new и delete являются ключевыми словами. А вот vector, string, list - это уже имена классов. Точно так же bad_alloc - это то ли имя класса, то ли элемент enum, то ли ещё какая-то хрень, которая НЕ является ключевым словом языка
1
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
21.02.2012, 21:30 16
Если исключение не перехватить, то оно прервет программу. Не зависимо от того, подключили ли вы new или нет.
0
Evg
Эксперт CАвтор FAQ
19288 / 7147 / 528
Регистрация: 30.03.2009
Сообщений: 19,997
Записей в блоге: 30
21.02.2012, 21:34 17
Цитата Сообщение от Konstantin_D Посмотреть сообщение
то неперехваченное исключение
bad_alloc не прервет программу?
Прервёт. Но класс bad_alloc (как и многие другие), если я правильно понимаю, является наследником класса std::exception (именно поэтому работает пример из поста #7).

Можно не ловить какой-либо конкретный тип exception'а, а вообще сделать catch (...). Для следующего примера вообще никакие подключаемые файлы не нужны

C++
1
2
3
4
5
6
7
8
9
try
{
  int *p = new int[1000000];
} catch (...)
{
  // Здесь мы поймаем любое исключение. Но никак не сможем его распознать,
  // потому что у нас нет никакой информации о его типе. Здесь мы можем только сделать
  // вывод, что при вызове new произошла КАКАЯ-ТО беда, но не известно какая
}
1
Konstantin_D
14 / 14 / 6
Регистрация: 21.07.2011
Сообщений: 89
21.02.2012, 22:51  [ТС] 18
Написал следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <typeinfo>
//#include <new>
 
int main()
try{
    double* pd = new double[500000000];
    delete [] pd;
}
catch(std::exception& ex)
{
    std::cout << "exception type: " << typeid(ex).name() << std::endl;
    std::exit(1);
}
Смущает что и с #include<new> и без него результат один - class std::bad_alloc.
Хоть класс bad_alloc и объявлен в заголовочном файле <new> он все равно
доступен в обоих случаях. Мне это кажется странным.
Ожидал либо другое исключение, либо отсутствие исключения (версию nothrow).
Извиняюсь, если вопрос показался глупым.
Всем спасибо.
0
Evg
Эксперт CАвтор FAQ
19288 / 7147 / 528
Регистрация: 30.03.2009
Сообщений: 19,997
Записей в блоге: 30
21.02.2012, 23:01 19
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Хоть класс bad_alloc и объявлен в заголовочном файле <new> он все равно
доступен в обоих случаях. Мне это кажется странным
Наверное, ты плохо понимаешь в наследовании. Ты ловишь ссылку на класс std::exception, которые есть родитель класса std::bad_alloc. Для этого сам класс std::bad_alloc видеть необязательно. Равно как и знать о его существовании. В этом и заключается один из великих смыслов наследования

Добавлено через 1 минуту
Вот есть хороший пример на наследование: Создать класс "Студент" и классы "Бюджетный студент" и "Коммерческий студент"
Обрати внимание, что в строках 61-64 работа идёт исключительно с указателем на базовый класс
1
Konstantin_D
14 / 14 / 6
Регистрация: 21.07.2011
Сообщений: 89
21.02.2012, 23:15  [ТС] 20
Ловил ссылку на базовый класс чтобы посмотреть какое в действительности исключение будет сгенерировано:

typeid(ex).name()
0
21.02.2012, 23:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2012, 23:15

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Добрый день!Работаю с графами,и при больших значениях столкнулся с...

bad_alloc или bad_alloc()
Здравия желаю!:) Хотелось бы узнать, какая разница между throw bad_alloc; и...

bad_alloc
народ че такое у меня прога прерывается и пишет &quot;std::bad_alloc&quot; ? кто знает...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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