Так, відповідь залежить від компілятора.
Швидкий експеримент з моїм компілятором ( g++ 4.4.3) виявляє, що його бібліотека часу виконання намагається спочатку mallocзапам'ятати для винятку і, у противному випадку, намагається розподілити простір у загальнопроцесорному "аварійному буфері", який живе в сегменті даних. Якщо це не спрацьовує, він телефонує std::terminate().
Здається, що основною метою буфера надзвичайних ситуацій є можливість перекидання std::bad_allocпісля того, як у процесі закінчиться куча місця (у цьому випадку mallocвиклик не вдасться).
Відповідною функцією є __cxa_allocate_exception :
extern "C" void *
__cxxabiv1::__cxa_allocate_exception(std::size_t thrown_size) throw()
{
void *ret;
thrown_size += sizeof (__cxa_refcounted_exception);
ret = malloc (thrown_size);
if (! ret)
{
__gnu_cxx::__scoped_lock sentry(emergency_mutex);
bitmask_type used = emergency_used;
unsigned int which = 0;
if (thrown_size > EMERGENCY_OBJ_SIZE)
goto failed;
while (used & 1)
{
used >>= 1;
if (++which >= EMERGENCY_OBJ_COUNT)
goto failed;
}
emergency_used |= (bitmask_type)1 << which;
ret = &emergency_buffer[which][0];
failed:;
if (!ret)
std::terminate ();
}
__cxa_eh_globals *globals = __cxa_get_globals ();
globals->uncaughtExceptions += 1;
memset (ret, 0, sizeof (__cxa_refcounted_exception));
return (void *)((char *)ret + sizeof (__cxa_refcounted_exception));
}
Я не знаю, наскільки типова ця схема.