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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.86
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
#1

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

21.02.2012, 19:00. Просмотров 5411. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос оператор new и исключение bad_alloc (C++):

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

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

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

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

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc - C++
Есть задача: Написать программу, которая считывает текст из файла и выводит его на экран, заменив цифры от 0 до 9 на слова &quot;ноль&quot;,...

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

22
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
21.02.2012, 21:30 #16
Если исключение не перехватить, то оно прервет программу. Не зависимо от того, подключили ли вы new или нет.
0
Evg
Эксперт CАвтор FAQ
18261 / 6386 / 440
Регистрация: 30.03.2009
Сообщений: 17,671
Записей в блоге: 28
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 / 2
Регистрация: 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
18261 / 6386 / 440
Регистрация: 30.03.2009
Сообщений: 17,671
Записей в блоге: 28
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 / 2
Регистрация: 21.07.2011
Сообщений: 89
21.02.2012, 23:15  [ТС] #20
Ловил ссылку на базовый класс чтобы посмотреть какое в действительности исключение будет сгенерировано:

typeid(ex).name()
0
Evg
Эксперт CАвтор FAQ
18261 / 6386 / 440
Регистрация: 30.03.2009
Сообщений: 17,671
Записей в блоге: 28
21.02.2012, 23:21 #21
Так это же переопределённый виртуальный метод
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.02.2012, 23:39 #22
оператор typeid возвращает объект (или ссылку на объект, что в данном случае не важно) типа type_info. у него нет виртуальных методов.
Скорее получение этого type_info является виртуальным, когда typeid вызывают с ссылкой на какой-то класс с хотябы одной виртуальной функцией.

Чтобы посмотреть на сообщение стандартного исключения, у него можно позвать функцию what(), которая должна вернуть описание исключения (не путать с типом исключения).
0
Evg
Эксперт CАвтор FAQ
18261 / 6386 / 440
Регистрация: 30.03.2009
Сообщений: 17,671
Записей в блоге: 28
22.02.2012, 00:02 #23
Ой, про typeid протупил. Я примерно понял, о чём вопрос идёт и только мельком глянул на пост. Почему-то подумал, что там what() написано
0
22.02.2012, 00:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2012, 00:02
Привет! Вот еще темы с ответами:

bad_alloc - C++
народ че такое у меня прога прерывается и пишет &quot;std::bad_alloc&quot; ? кто знает что это? и как с этим бороться ?

Bad_alloc - C++
Ребят, не сочтите меня за извращенца, но как можно спровоцировать new пробросить bad_alloc? Не было бы проблем, если бы можно было пихнуть...

std::bad_alloc - C++
Здравствуйте. Пишу программу на Code::Blocks. Когда компилирую и запускаю в среде, то программа выполняется нормально. Когда запускаю...

std::bad_alloc - C++
Сразу оговорюсь, что пришёл в C++ из JavaScript, поэтому прошу сильно не бить. Суть в следующем: у нас есть 2 массива из bool (точнее 2...


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

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

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