Ошибки исключения в С++

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

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

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

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

Ответ 1

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

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

bad_alloc исключение bad_alloc.

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

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

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

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

Ответ 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!

Ответ 3

  • Да: std:: bad_alloc

  • По-моему, это уже не часть STL, что новый оператор. (Вы можете поймать... но вы потеряете возможность распознать другие исключения).

  • Он не нужен, новый будет генерировать исключение и не возвращать NULL.

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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