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

  • Day9TV

    Day9TV

    22 NİSAN 2010
  • PUSHER

    PUSHER

    11 HAZİRAN 2014
  • YAN TV

    YAN TV

    20 EKİM 2011