Полезно ли проверять возврат & # 8220; new & # 8221; в С ++?

StackOverflow https://stackoverflow.com/questions/239302

  •  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 теперь бросает то, что говорит стандарт.

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top