Вы не можете восстановить из-за ошибки сегментации, поскольку после возникновения ошибки ваша программа больше не находится в четко определенном состоянии, и нет механизма для отката в четко определенное состояние, либо.
Ошибка сегментации всегда является ошибкой программирования, так или иначе, и вы должны просто ее избежать.В C ++ вы можете просто перехватывать исключения, возникающие при динамическом распределении:
T * p;
try { p = new T; }
catch(const std::bad_alloc & e) { /* ... */ }
Обычно нет необходимости быть достаточно ручным, поскольку вы бы обернули свои динамические выделения в подходящие управляющие контейнеры (например, * 1008).* или shared_ptr
), и вы должны ловить исключения (даже не только выделения) в тех точках потока вашей программы, где вы можете обработать ошибку и продолжать многозначительно.
(благодаря исключениям, которые выобычно не нужно проверять результат возможного выброса функций прямо на стороне вызова - вот и весь смысл использования исключений.)
Если по какой-то причине вы просто хотите выделить необработанную память, не создаваялюбой объект, вы можете сделать это двумя способами:
// Method #1, the C++ way:
void * addr = ::operator new(n); // will throw std::bad_alloc on error
// Method #2, the manual way:
void * addr = std::malloc(n);
if (!addr) throw std::bad_alloc(); // throw exception manually, handled elsewhere