Полезно ли проверять возврат & # 8220; new & # 8221; в С ++?
-
04-07-2019 - |
Вопрос
Обычно я никогда не вижу тестов на новые в C ++, и мне было интересно, почему.
Foo * f = new Foo;
// f предполагается как выделенный, почему обычно никто не проверяет возвращение нового?
Решение
Согласно текущему стандарту, new никогда не возвращает NULL , вместо этого он выдает std :: bad_alloc. Если вы не хотите, чтобы new выдавал (в соответствии со старым стандартом), а вместо этого возвращал NULL, вы должны вызвать его, добавив после него " (std :: nothrow) " ;. то есть. р>
Foo* foo = new (std::nothrow) Foo;
Конечно, если у вас очень старый или возможно сломанный набор инструментов, он может не соответствовать стандарту.
Другие советы
Все зависит от того, как ваш компилятор VC ++ до версии 6 выдает NULL в случае сбоя нового оператора в приложении без MFC.
Теперь проблема становится больше, когда вы используете, например, STL с VC ++ 6, потому что STL соответствует стандартам, которые он никогда не будет проверять на NULL, когда ему нужно получить немного памяти, и угадывать, что произойдет в условиях нехватки памяти .. ..
Так что для всех, кто все еще использует VC ++ 6 и STL, просмотрите эту статью для Исправления. Не допускайте, чтобы ошибки выделения памяти приводили к краху устаревшего приложения STL а> р>
Все зависит от того, какая версия C ++ предназначена для кода. Спецификация c ++ уже давно заявляет, что, по крайней мере, по умолчанию, сбои в new вызовут исключение c ++, поэтому любой код, выполняющий тест, будет полностью избыточным. В настоящее время большинство программ также нацелено на операционные системы с виртуальной памятью, где почти невозможно исчерпать память, а состояние нехватки памяти настолько фатально в любом случае, что просто дать сбой приложению при следующем доступе NULL - это хороший способ любого из терминатор.
Это действительно только во встроенном программировании, где обработка исключений считается слишком большой нагрузкой, а память очень ограничена, и программисты стараются проверять наличие новых ошибок.
Как указано здесь
" В компиляторах, соответствующих стандарту ISO C ++, если памяти недостаточно для выделения, код выдает исключение типа std :: bad_alloc. Весь последующий код прерывается до тех пор, пока ошибка не будет обработана в блоке try-catch или программа не выйдет ненормально. Программе не нужно проверять значение указателя; если не было выдано исключение, распределение прошло успешно. "
new
выбрасывает std :: bad_alloc
по умолчанию. Если вы используете значение по умолчанию, проверка на null устарела, но обработка исключений необходима. Такое поведение по умолчанию согласуется с парадигмой безопасности исключений C ++ - обычно она предусматривает, что объект либо создан, либо не выделен
если вы переопределяете значение по умолчанию, используя new (std :: nothrow)
, проверка на null необходима. & Quot; Новый & Quot; и распределяет, и фиксирует страницы, поэтому возможно исчерпать память либо потому, что у вас закончились дескрипторы страниц, либо из-за отсутствия физической памяти
исследуйте управление памятью в вашей ОС. Эталонный компьютер C / C ++ не знает, как ваша ОС управляет памятью, поэтому полагаться на один язык небезопасно. Пример неправильного распределения памяти читайте в C malloc ()
+ перегрузка Linux
Обычно никто не проверяет возврат нового в новом коде, потому что Visual Studio теперь бросает то, что говорит стандарт.
В старом коде, если взлом был сделан, чтобы избежать броска, вам все же лучше проверить.