हां, उत्तर संकलक-निर्भर है।
मेरे संकलक ( 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));
}
मुझे नहीं पता कि यह योजना कितनी विशिष्ट है।