В этой заметке я бы хотел коснуться старого как мир вопроса выделения памяти. В C++ для выделения памяти используется operator new, который в свою очередь вызывает calloc. Разумеется есть возможность переопределить этот оператор, но сейчас не про это. Как известно, malloc (и его разновидность calloc) возвращает адрес на выделенную память в случае успеха и NULL в случае, если память выделить не удалось. Как показала многолетняя практика поиска ошибок в программах на C, многие прогаммисты не проверяют указаель возвращенный после использования malloc, а сразу разименовывают его и пишут туда данные. Нетрудно догадаться что в случае нулевого указателя программа безнадежно падает.
Для того чтобы разработчики не могли игнорировать этот аспект, комитет по стандартизации C++ внес дополнение в стандарт, согласно которому стандартный operator new должен генерировать исключение std::bad_alloc. Таким образом, если обработка исключений отсутствует программа свалится по исключению, а не с segmentation fault что позволит намного быстрее найти ошибку.
Однако. Не редки случае когда разработчики программы на C++ сознательно не используют исключения (предпочитая им проверки возвращаемых заначений) и не хотят чтобы программа приносила им сюрпризы в виде исключений. Можно конечно обернуть использование new в блок try / catch, но есть способ лучше: std::nothrow. Использование этой константы предотвращет возбуждение исключения std::bad_alloc в operator new, вместо этого в случае ошибки будет возвращен нулевой указатель.
Короткий пример:
#include <new>
...
char* p = new (std::nothrow) char [1048576];
if (p == NULL)
ПаникаПаника!
...
Ссылки по теме: