Ошибки исключения в С++
В школьном проекте моего проекта мне было предложено создать программу, не использующую 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