|
0 / 0 / 0
Регистрация: 08.04.2010
Сообщений: 10
|
|||||||||||
Обработка исключений для new08.04.2010, 21:41. Показов 17252. Ответов 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 | |
|
Помогаю со студенческими работами здесь
40
Обработка исключений обработка исключений Обработка исключений Обработка исключений
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|