понедельник, 29 июня 2015 г.

[prog.c++.memories] А ведь я еще помню времена, когда new в C++ мог возвращать NULL :)

Отголоски темы про исключения в C++ (#1, #2) продолжают давать о себе знать. Внезапно довелось вспомнить, что ведь operator new в C++ далеко не всегда бросал bad_alloc в случае невозможности выделить память. И в появлении такого поведения с bad_alloc-ом нужно благодарить стандарт C++98.

А ведь до этого new в случае неудачи мог возвращать NULL. И результат new, как и результат malloc-а, нужно было контролировать.

Правда, существовали compiler-specific функции set_new_handler/_set_new_handler (пруф можно найти в старенькой PDF-ке, раздел 4.3.3). Устанавливаемый через set_new_handler обработчик позволял вызвать abort() при неудаче выделения памяти. Что упрощало написание кода до примитивизма: нет свободной памяти, значит и работу продолжать не нужно :). Но даже если set_new_handler-а не было, можно было определить свой глобальный new, который сам вызывал abort.

Да, вот были же времена... Которые сейчас не хочется вспоминать даже в страшном сне :)


PS. Кстати, для тех противников исключений, которые приводят в пример Google C++ Style Guide или JSF C++ Coding Standards: не берусь утверждать на 100%, но в недавнем MISRA-C++ использование C++ных исключений разрешено. Кроме того, если брать тот же JSF C++ Coding Standard, то он относится ну к очень специфической области, в которой даже использование new/delete разрешено лишь на этапе начальной инициализации. MISRA, кстати говоря, так же относится к этой области. Но MISRA-C++ разрабатывался уже после JSF C++, так что какие-то вещи авторы MISRA-C++ пересмотрели и оценили по-новому.

Комментариев нет: