2010-08-02 3 views
7

Можно создать дубликат:
Will new return NULL in any case?Будет ли новый оператор возвращать NULL?

Скажем у меня есть автомобиль класса и я создать объект

Car *newcar = new Car(); 
if(newcar==NULL) //is it valid to check for NULL if new runs out of memory 
{ 
} 
+2

Duplicate of [Будет ли новый возврат NULL в любом случае?] (Http://stackoverflow.com/questions/550451/will-new-return-null-in-any-case) –

ответ

28

О реализации стандартов соответствующих требованиям C++, нет. Обычная форма new никогда не вернется NULL; если выделение не удастся, будет выбрано исключение std::bad_alloc (форма new (nothrow) не генерирует исключений и возвращает NULL, если распределение не выполнено).

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

+0

Ровно! Способ сделать это на C++ - это блоки try/catch. Вот пример: http://www.cplusplus.com/reference/std/new/bad_alloc/ – karlphillip

2

По умолчанию C++ выдает исключение std :: bad_alloc, когда новый оператор терпит неудачу. Поэтому проверка на NULL не требуется, если вы явно запретили использование исключений.

+0

... и если вы отключите использование исключений, то язык больше не является C++. –

8

No, new throws std::bad_alloc по поводу отказа распределения. Вместо этого используйте new(std::nothrow) Car, если вы не хотите исключений.

1

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

+0

Что ты имеешь в виду? Это не исключение в C, и я не уверен, какое поведение вы считаете разумным, если ни один из них. – Chuck

+4

«Проверка на нуль», я думаю, он имеет в виду. –

+0

«Проверка нулевого» широко распространенного рефлекса gag определенно была причиной того, что какой-то программист VC6, внедряющий «новый» в то время, решил вернуть NULL, было разумной задачей. возможно, malloc сделал это, и с тех пор, как новые только wraps malloc ... –

Смежные вопросы