Ben `bir şey atmak ne zaman, nerede hafızada saklanır?
Anlıyorum o zaman bir şey throw
n, yığın 'çözülmemiş' noktasına yakalanıp, yıkıcılar ve sınıf örnekleri yığındaki her bir işlev bağlamı çalıştırın (bu yüzden değil bir istisna atar bir yıkıcı - sonunda atma ikincisi)...Ama nerede acaba hafıza nesne var atılır muhafaza ederken bu olur?
Uygulama bağımlı mı? Eğer öyleyse, belirli bir yöntem en popüler Derleyiciler tarafından kullanılan var mı?
CEVAP
Evet, cevap derleyici bağımlı.
Hızlı bir deneme ile benim derleyici (g 4.4.3
) ortaya onun çalışma zamanı kitaplığı ilk çalışır malloc
bellek için istisna ve başarısız olduğunu, girişimleri için tahsis alanı içinde bir işlem çapında "acil tampon" hayatları üzerinde veri kesimi. Eğer bu işe yaramaz ise, std::terminate()
çağırır.
Öyle görünüyor ki ana amaç acil tampon yapabilmek için atmak std::bad_alloc
sonra işlemi sona erdi yığın alanı (bu durumda malloc
arama başarısız olabilir).
İlgili fonksiyonu __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 ();
}
// We have an uncaught exception as soon as we allocate memory. This
// yields uncaught_exception() true during the copy-constructor that
// initializes the exception object. See Issue 475.
__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));
}
Nasıl normal bu düzeni olduğunu bilmiyorum.
Nasıl, nerede ve ne zaman genel yöntem...
Nerede kaydedilmiş makroları Not Defte...
Ne zaman Yazma Hatası kullanın vs Atma...
Nerede lambda ifade bir zaman uyumsuz ...
Nerede iOS 5 simülatörü ekran görüntül...