информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Spanning Tree Protocol: недокументированное применениеСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Раз уж пользуешься CPP, используй exception-ы 13.04.03 16:00  Число просмотров: 1180
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Будет намного нагляднее. Тем более, что как написано в MSDN:
The default behavior of a new handler is to throw an object of type bad_alloc. A null pointer designates the default new handler.

> > Если уж ты в конструкторе написал проверку успешного
> > выделения памяти, то чем провинился operator+? :)
>
> Сейчас у меня проверка успешного выделения памяти везде,
> где выделяется память под саму строку (char *dstr). Если не
> выделилась - exit(1). А для вспомогательный переменных
> сделаю что-нить типа флаговой переменной memflag, которая
> по дефолту=0 и увеличивается при каждой ошибке выделения
> памяти. В конце каждого метода либо проверка if(memflag)
> return -2; либо еще что-нибудь..
Если у тебя выполнилась следующая после new инструкция, значит память выделилась нормально. Если ты не будешь ловить bad_alloc, то когда стек свернется за пределы main-а, там стоит дефолтовый обработчик эксепшнов, который вызывает terminate, которая по дефолту вызывает abort. Короче, не надо ничего писать и тогда ты вывалишься из проги если память выделилась неудачно.

Если тебе это не подходит, пользуйся или new(nothrow) (нужно сделать #include <new> для использования) или сделать:

try { // Любое количество new без проверки успешности } catch(bad_alloc ba) { // Освободить немного памяти и попытаться еще раз }

Если компилятор поддерживает стандарт C++ от 98-го года (номер не помню, но принимался он ISO/IEC), то все должно работать правильно. VC начиная с 6-го пытаются поддерживать этот стандарт (хотя я еще не слышал ни об одном компилере, который бы полностью соответствовал этому стандарту).
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach