|
0 / 0 / 0
Регистрация: 08.04.2010
Сообщений: 10
|
|||||||||||
Обработка исключений для new08.04.2010, 21:41. Показов 18238. Ответов 41
Метки нет (Все метки)
Всем привет!
Вопрос следующий. Когда функция new не может выделить память, то генериться исключение bad_alloc. Допустим есть следующий код:
А вот другой пример:
Вопрос: как в этом случае ведет себя new и как попасть в блок catch()?
0
|
|||||||||||
| 08.04.2010, 21:41 | |
|
Ответы с готовыми решениями:
41
Обработка исключений с пмощью структурированной обработки исключений Обработка исключений в классах для пользовательских типов Обработка исключений |
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
||
| 09.04.2010, 12:14 | ||
Сообщение было отмечено как решение
Решениеесли памяти много - работает один, если мало - другой. чаще всего, значительная часть выделенной памяти вообще не используется, или используется крайне редко. на этом и построен обычный страничный обмен Windows с файлами подкачки. хорошо спроектированная программа тоже может делать подобное - например, использовать временные файлы. т.е., при возникновении исключения по нехватке памяти, обработчик исключения выгружает ненужные в текущий момент данные в файл, освобождает память, и продолжает работу.
1
|
||
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
||
| 09.04.2010, 14:20 | ||
|
1
|
||
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
||||||
| 09.04.2010, 15:46 | ||||||
|
Может кто объяснить у меня на VC++ 6.0 new вернула NULL без всяких примочек,
может я что то не до понимаю или это компилятор старый или что?
Щас проверю на VS 2008 Добавлено через 4 минуты Не по теме:
Добавлено через 10 минут Если кто знает как проверить эту особенность в Visual Studio 2008 пожалуйста отпишитесь, есть ли это в VS 2008.
0
|
||||||
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
| 09.04.2010, 15:57 | |
|
Genius Ignat, скорее всего дело в IDE или ее настройках. MSVS 2005/2008 ведет себя согласно стандарту - кидает std::bad_alloc.
1
|
|
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
| 09.04.2010, 16:05 | |
|
Ну мягкомалые дают то так:
int *p = NULL; delete p; //ошибочка у них в VC++ 6.0, то new возвращает NULL по умолчанию. Провел ещё тест в VS2008 на bad_alloc реагирует и если передашь nothrow тоже. Короче говоря это проблемы microsoft, жаль эту фичу не перенести на VS2008.
0
|
|
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|
| 09.04.2010, 16:33 | |
|
меня вообще удивляет, как это вы вызываете векторный оператор new для выделения массива под скалярные переменные.
а потом еще и пытаетесь их удалить. когда я пытался так сделать несколько лет назад, у меня программа очень стабильно вываливалась с ошибкой.
0
|
|
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
| 09.04.2010, 16:38 | |
|
Прочитал:
http://ru.wikipedia.org/wiki/New_(C%2B%2B) и это про заморочки с VC++ 6.0: http://forum.ixbt.com/topic.cgi?id=26:15791 И понял что ввел себя в заблуждение надеюсь только себя, а если еще кого тогда извиняюсь. Надо завязывать со старым компилятором иначе к новому ни когда не привыкну. Добавлено через 2 минуты За ссылку на форум извинюсь.
1
|
|
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
| 09.04.2010, 16:41 | |
|
Genius Ignat, в случае неоднозначности заглядывай в стандарт. Все таки именно он должен быть первоисточником, а не документация производителя компилятора.
1
|
|
| 09.04.2010, 16:45 | |
|
Не по теме:
0
|
|
| 09.04.2010, 19:53 | |
|
0
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||
| 09.04.2010, 23:12 | ||
|
А вот нельзя возбуждать исключения - в деструкторе.
2
|
||
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
| 09.04.2010, 23:54 | |
|
CheshireCat, хорошо, я слишком категорически выразился.
Возбуждение исключений в конструкторе при возможности стоит избегать. Проблема в том, что если объект создается динамически и в конструкторе возникнет исключение, то деструктор вызван не будет. В связи с этим нужно очень аккуратно следить за процессом конструирования, чтобы суметь откатится назад.
1
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
| 10.04.2010, 10:44 | |
|
Хорошо, поправка насчет излишней категоричности принята :-)
А вот в остальном - тоже не вполне верно. Да, если в конструкторе выброшено исключение, то деструктор вызван никогда не будет - объект еще никогда не "жил". Однако, Стандарт языка гарантирует нам, что для всех уже полностью сконструированных до этого момента подъобъектов (баз и членов) будут вызваны их деструкторы. Так что вручную следить за корректным "откатом назад" не стоит - если, конечно, сами конструкторы/деструкторы баз и членов выполнены правильно.
1
|
|
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
||||||
| 10.04.2010, 12:27 | ||||||
|
Раскрою одну страшную тайную которая не является тайной, недавно узнал что
в конструкторе можно делать return; а ещё есть механизм обработки ошибки в конструкторе без исключения, это я узнал из COM вероятно стандартом исключения там не разрешены.
и проверяем его значение на удачность. Раньше я не задумывался: что возвращаемое значение еще можно получать через параметры. Может кому интересен этот способ. Добавлено через 11 минут Как быть с конструктором копирования и операцией присваивания это надо подумать. Добавлено через 3 минуты Одно есть преимущество при такой передаче юзер обязан передать hr это и радует. А от возвращаемого значения можно отказаться допустим при вызове простой функции. Добавлено через 6 минут А кто хочет обрабатывать(bad_alloc) new в конструкторе предусмотрено такое для hr значение: E_OUTOFMEMORY;
0
|
||||||
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
| 10.04.2010, 12:45 | |
|
CheshireCat, да, но если в конструкторе некие объекты создаются динамически, то при исключении они уничтожены не будут. Поэтому нужно либо следить (чтобы не забыть удалить), какие объекты к моменту исключения были созданы динамически, либо использовать некие обертки над такими объектами, которые сами в случае чего их удалят.
0
|
|
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
| 10.04.2010, 13:21 | |
|
Языки не совершенны и где нибудь да найдется не удобная запарка.
CyBOSSeR: Может все проще: ждем сборщик мусора, а пока терпим неудобства. Судя по VC++ 6.0, если сборщик мусора будет в новом стандарте C++, в компиляторах он появится с опозданием и недоделками.
0
|
|
| 10.04.2010, 13:27 | |
|
1
|
|
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
||
| 10.04.2010, 13:40 | ||
|
Не вижу в ней смысла никакого вообще.
0
|
||
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|||
| 10.04.2010, 14:12 | |||
Добавлено через 20 минут
что просто по мне так то что сказал CyBOSSeR проще, реализовать new с параметром nothrow.Так как при nothrow понятно создан объект значит !NULL. А без nothrow мне видится картина с массивом указателей хранящих NULL а если объект создан в массив заносится адрес созданного объекта. А если возникнет исключение, с помощью массива можно зачистить все не NULL. Добавлено через 57 секунд Думаю я размышляю в правильную сторону.
0
|
|||
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
||
| 10.04.2010, 14:19 | ||
|
1
|
||
| 10.04.2010, 14:19 | |
|
Обработка исключений обработка исключений Обработка исключений Обработка исключений
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки.
Добавлено:
- Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|