![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 01.12.2008
Сообщений: 58
|
![]()
Здравствуйте! Снова возникло желание подавить исключение bad_alloc (возникает при запросе блока динамической памяти, если свободного блока такого размера нет). В общем привожу 3 варианта кода. 1-й рабочий - остальные нет. Вот хотелось бы узнать...почему?
Код1 (рабочий) Код:
Код:
Код:
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,089
|
![]()
Предположения следующие:
2) set_new_handler(0) возвращает стандартное поведение на ошибку оператора new, а не делает так, что экзепшен не валится. В данном случае от этой строки, как я понимаю, ничего не меняется. Для этого, кажется, существует параметр nothrow для оператора new, т.е. надо выделять память так: "new (nothrow) ..." 3) попробуйте написать так: catch(std::bad_alloc&) предполагаю, что нет места для создания копии выкинутого bad_alloc'a |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 01.12.2008
Сообщений: 58
|
![]()
Так... код №2 заработал с изменениями. 3-й пока работать не хочет..
Смущает одно: прикрепил скриншот страницы книжки Архангельского...судя по ней всё правильно..даже правильно во втором коде без изменений... Код:
Последний раз редактировалось Troi666; 11.08.2009 в 19:27. |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,089
|
![]()
Возможно проблема из-за различия версий вышего компилятора и компилятора автора книги. Builder изначально слабо поддерживал стандарт С++ и много там внесено "отсебятины", но постепенно он движется к истинному С++, а потому поведение некоторых функций могло измениться. Кроме того, стандарт С++ тоже не стоит на месте и то, что было правильно 5 лет назад, может быть неправильно сейчас.
3-й пример у меня отработал нормально в MS VC++ 2008 и в вашем и в моём варианте, но всёже предпочтительнее ловить ссылку, а то куска памяти под дополнительный bad_alloc может не оказаться. Стандарт языка гарантирует наличие памяти только под один bad_alloc, а остальное уже - особенности конкретного компилятора. Посмотрите еще по F1 что на счет bad_alloc и set_new_handler написано. Может там примерчики подходящие будут именно для вашего компилятора. |
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 01.12.2008
Сообщений: 58
|
![]()
Спасибо! Но тем не менее всё пока остаётся достаточно странным... Вот что удалось по set_new_handler отрыть
![]() |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,089
|
![]()
Delphi по умолчанию перехватывает все исключения вне зависимости от наличия блока try. Может билдер так же поступает. Попробуйте запустить exe через проводник, а не из среды.
A с set_new_handler вообще непонятки какие-то. Везьде пишут, что set_new_handler(0) возвращает стандартное поведение, но в некоторых местах с оговоркой, что не бросаются исключения. Если рассуждать логически: set_new_handler возвращает указатель на предыдущий обработчик исключения и в первый раз возвращает ноль, т.е. стандартное поведение идёт при указателе на обработчик равном нулю. Таким образом, мы пытаемся ноль поменять на ноль, т.е. смысла никакого в данном случае вроде как и нет. Ну а если стандартное поведение бросает исключения, то и после set_new_handler(0) исключения бросаться будут. В общем, по логике вещей тут "which does not throw exceptions" лишнее, а иначе просто к стандартному поведению никак не вернемся. Последний раз редактировалось pu4koff; 11.08.2009 в 20:43. |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 01.12.2008
Сообщений: 58
|
![]()
Огромное спасибо! Код 3 из проводника запустился и выполнился без проблем и в вашем и моём случаях! Похоже билдер действительно ловит всё, что захочет самостоятельно
![]() |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Подавление запросов системы безопасности Outlook2003 | eva_yk | Общие вопросы .NET | 0 | 28.07.2009 03:13 |
Обход Н/Д | Slavik | Microsoft Office Excel | 2 | 09.05.2009 00:49 |
С++|bad_alloc|Заполнение оперативной памяти | Troi666 | Помощь студентам | 0 | 30.04.2009 00:15 |
Подавление перехода по ссылке, не должно происходить событие | Elfer | JavaScript, Ajax | 2 | 31.08.2008 19:50 |
обход дерева | ribka | Помощь студентам | 2 | 11.12.2007 20:38 |