Подтвердить что ты не робот

Полезно ли проверять возвращение "нового" в С++?

Обычно я никогда не вижу теста для нового в С++, и мне было интересно, почему.

Foo *f = new Foo;

// f is assumed as allocated, why usually, nobody test the return of new?

4b9b3361

Ответ 1

В соответствии с текущим стандартом, новый никогда не возвращает NULL, вместо этого он выдает std:: bad_alloc. Если вы не хотите, чтобы новый бросал (по старому стандарту), а скорее возвращал NULL, вы должны называть его, поставив его с помощью "(std:: nothrow)". то есть.

Foo* foo = new (std::nothrow) Foo;

Конечно, если у вас очень старая или, возможно, сломанная инструментальная цепочка, она может не соответствовать стандарту.

Ответ 2

Все зависит от вашего компилятора VС++ до версии 6 дает NULL, если новый оператор терпит неудачу, в не-MFC-приложении.

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

Итак, для всех, кто все еще использует VС++ 6 и STL, проверьте эту статью для исправления. Не позволяйте сбоям в распределении памяти сбой вашего устаревшего приложения STL

Ответ 3

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

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

Ответ 4

Как указано здесь

"В компиляторах, соответствующих стандарту ISO С++, если для распределения недостаточно памяти, код генерирует исключение типа std:: bad_alloc. Все последующие коды прерываются до тех пор, пока ошибка не будет обработана при попытке try блок или программа выходит из строя. Программе не нужно проверять значение указателя, если не было выбрано исключение, распределение было успешным."

Ответ 5

  • new throws std::bad_alloc по умолчанию. Если вы используете значение по умолчанию, проверка на null является устаревшей, но обработка исключений необходима. Это поведение по умолчанию согласуется с парадигмой безопасности исключений С++ - обычно это означает, что объект либо сконструирован, либо не назначен

  • если вы переопределите значение по умолчанию с помощью new (std::nothrow), необходимо проверить значение null. "Новый" как выделяет, так и фиксирует страницы, поэтому возможно исчерпать память либо из-за того, что у вас закончились дескрипторы страниц, либо из-за отсутствия физической памяти

  • исследуйте управление памятью ОС. Контроллер C/С++ не знает, как ваша ОС управляет памятью, поэтому полагаться только на язык небезопасно. Например, распределение памяти прошло плохо, прочитайте на C malloc() + Linux overcommit

Ответ 6

Обычно никто не проверяет возврат нового в новый код, потому что Visual Studio теперь бросает так, как говорит стандарт.

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