C ++, Стандартные исключения библиотеки - PullRequest
1 голос
/ 30 мая 2011

В C ++ "new.h" нижеуказанный класс определен

class bad_alloc : public exception 
{
   public:
        bad_alloc() throw() { }
        virtual ~bad_alloc() throw();
};

И конструкторы, и деструкторы явно указаны для исключения исключений, у него нет других функций-членов, но он наследует класс "исключений".

Я предполагаю, что оператор "new" использует этот класс, чтобы выдавать исключение при возникновении ошибки во время выделения. Но как ? нет действительной функции-члена, как она на самом деле используется в коде?

Я хочу знать, для чего используется объявление этого класса "bad_alloc"? Пожалуйста, помогите мне.

Ответы [ 9 ]

2 голосов
/ 30 мая 2011

Исключения не обязательно должны иметь участников. Вы объявляете классы так, чтобы их можно было явно перехватить:

try {
    Foo * foo = new Foo();
}
catch(std::bad_alloc &) {
    std::cout << "could not allocate" << std::endl;
}

Название типа - это вся необходимая информация. Вышеупомянутое утверждение поймает только bad_alloc и все его подклассы.

2 голосов
/ 30 мая 2011

Функции-члены не требуются - это совершенно правильно:

throw 42;

В основном с исключениями нас интересует тип исключения, а не многое другое.Однако стандартные исключения наследуют некоторые функции из базового класса исключений.

1 голос
/ 30 мая 2011

Это код для нового оператора.Ничего особенного.Он просто создает экземпляр этого класса.

#define _RAISE(x)   throw (x)

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
        {       // try to allocate size bytes
        void *p;
        while ((p = malloc(size)) == 0)
                if (_callnewh(size) == 0)
                {       // report no memory
                static const std::bad_alloc nomem;
                _RAISE(nomem);
                }

        return (p);
        }
1 голос
/ 30 мая 2011

Объект класса создается и затем выбрасывается: throw bad_alloc();.По сути вы можете бросить любой объект или значение.Затем этот тип можно использовать в операторе catch() для захвата только такого рода исключений.

Пример:

try
{
   // some code throwing exceptions
}
catch(const bad_alloc&)
{
    // this code is only run if an object of class bad_alloc is thrown
}
catch(const exception&)
{
    // this code is run if an object of class exception (or any unhandled derivated class) is thrown
}

Вы также можете игнорировать такие классы и просто бросать строки (throw«Произошла ошибка!»), Но вы не можете их дифференцировать, поэтому вы либо обрабатываете все строки, либо ни одной.

1 голос
/ 30 мая 2011

нет действительной функции-члена, как она на самом деле используется в коде?

Цель этого класса - исключительно сообщить (вызывающему new) о неудачном выделении (= нехватке свободной памяти). Ему не нужны никакие функции-члены.

1 голос
/ 30 мая 2011

Действительные функции-члены наследуются от exception. Цель bad_alloc состоит в том, что вы не можете поймать его, когда ищете runtime_error или logic_error.

0 голосов
/ 30 мая 2011

Хотя запрос на 4 гигабайта памяти, скорее всего, приведет к перехватываемой исключительной ситуации std :: bad_alloc, перехват bad_alloc в целом немного рискован.

try {
  char * one_byte = new char(42);
}
catch (std::bad_alloc & except) {
  // Doing anything but calling exit here will almost certainly fail.
}
0 голосов
/ 30 мая 2011

A bad_alloc возникает исключение, когда new не удается выделить память.

Классический C malloc() сигнализировал о проблеме, возвращая указатель NULL, но в C ++ оператор new выбрасываетисключение вместо этого.Затем вы можете перехватить исключение:

try {
    int * bigArray = new int[1024*1024*1024] ;
}
catch (bad_alloc& ex) { 
    cout<<"bad_alloc :"<<ex.what()<<endl ;
}

Обратите внимание, что вы можете использовать специальную версию new, которая не выдает исключение, но возвращает указатель NULL в случае ошибки.Вы можете использовать его, позвонив new (nothrow) вместо new

0 голосов
/ 30 мая 2011

Это исключение, возникающее в ситуациях, когда какой-либо подпрограмме не удалось выделить память.Он используется следующим образом, если вы хотите сообщить о таком условии:

throw std::bad_alloc();

Кроме того, если вы хотите перехватить ошибки выделения памяти, он выглядит так:

try {
    ...do something here...
} catch (const std::bad_alloc& ex) {
    ...print an error message or handle the exception in some other way...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...