SORU
7 Temmuz 2011, PERŞEMBE


Ben `bir şey atmak ne zaman, nerede hafızada saklanır?

Anlıyorum o zaman bir şey thrown, 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
7 Temmuz 2011, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boniver

    boniver

    17 NİSAN 2006
  • Elly

    Elly

    3 EKİM 2005
  • SunsetTrance

    SunsetTrance

    20 EYLÜL 2008