Có, câu trả lời là phụ thuộc vào trình biên dịch.
Một thử nghiệm nhanh với trình biên dịch của tôi ( g++ 4.4.3
) cho thấy rằng thư viện thời gian chạy của nó trước tiên cố gắng malloc
lưu trữ ngoại lệ và thất bại đó, cố gắng phân bổ không gian trong một "bộ đệm khẩn cấp" toàn quy trình nằm trên phân đoạn dữ liệu. Nếu điều đó không thành công, nó sẽ gọi std::terminate()
.
Có vẻ như mục đích chính của bộ đệm khẩn cấp là có thể ném std::bad_alloc
sau khi quá trình chạy hết dung lượng heap (trong trường hợp đó malloc
cuộc gọi sẽ thất bại).
Chức năng liên quan là __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));
}
Tôi không biết chương trình này điển hình như thế nào.