Плохое распределение исключений в C ++ - PullRequest
10 голосов
/ 06 января 2011

В моем школьном проекте меня попросили создать программу без STL.
В программе я использую много

Pointer* = new Something;
if (Pointer == NULL) throw AllocationError();

Мой вопрос об ошибках размещения:
1. существует ли автоматическое исключение, генерируемое новым при неудачном размещении?
2. если так, как я могу поймать это, если я не использую STL (#include "exception.h)
3. Достаточно ли использовать тестирование NULL?

спасибо.
Я использую eclipseCDT (C ++) с MinGW на Windows 7.

Ответы [ 6 ]

13 голосов
/ 06 января 2011

Да, новый оператор автоматически выдаст исключение, если он не сможет выделить память.

Если ваш компилятор не отключит его каким-либо образом, новый оператор никогда не вернет указатель NULL.

Этовыдает bad_alloc исключение.

Также существует версия nothrow новой версии, которую вы можете использовать:

int *p = new(nothrow) int(3);

Эта версия возвращает нулевой указатель, если память не может быть выделена.Но также обратите внимание, что это не гарантирует 100% nothrow, поскольку конструктор объекта все еще может генерировать исключения.

Немного больше информации: http://msdn.microsoft.com/en-us/library/stxdwfae(VS.71).aspx

3 голосов
/ 06 января 2011
  1. существует ли исключительное исключение, генерируемое новым при неудачном выделении?
  2. если так, как я могу поймать его, если я не использую STL (#include "exception.h)

Да. Смотрите этот пример. Также показано, как отловить исключение!

  try
  {
    int* myarray= new int[10000];
  }
  catch (bad_alloc& ba)
  {
    cerr << "bad_alloc caught: " << ba.what() << endl;
  }

Отсюда: http://www.cplusplus.com/reference/std/new/bad_alloc/

3. использует тестирование NULL enugh

Это не нужно, если вы не перегружаете оператор new!

1 голос
/ 06 января 2011

Стандартный C ++ генерирует исключение, если запрошенная память не может быть выделена. Если вы хотите NULL вместо исключения, тогда синтаксис будет

Whatever *p = new (std::nothrow) Whatever;

Этот синтаксис является всего лишь случаем выделения с "размещением нового", которое позволяет функции распределителя получать параметры.

В большинстве случаев я проверял NULL после new в коде Visual C ++, где поведение по умолчанию ::operator new - возвращать NULL вместо того, чтобы вызывать исключение, как требует стандарт (это IMO из многих областей, в которых Microsoft пыталась (все еще пытается?) бороться с переносимым кодом).

1 голос
/ 06 января 2011
  1. Да: std :: bad_alloc

  2. На мой взгляд, это больше не является частью STL, чем оператор new. (Вы можете поймать ... но вы потеряете возможность описать с другими исключениями).

  3. Это не нужно, новый вызовет исключение и не вернет NULL.

0 голосов
/ 06 января 2011

зависит Старый компилятор c ++ предоставляет set_new_handler для определения ошибки выделения. Вы также можете поймать исключение bad_alloc.

http://en.wikipedia.org/wiki/New_%28C%2B%2B%29

Если вы хотите контролировать это, вы также можете переопределить пару operator new / operator delete

0 голосов
/ 06 января 2011

Стандартный новый генерирует исключение bad_alloc при сбое, поэтому проверка на нуль не требуется.

...