SORU
2 Aralık 2008, Salı


Statik başlatma bulma C sipariş sorunları

static initialization order fiasco, ile bazı sorunlar yaşadık ve kod bir sürü Olası oluşumları bulmak için tarak ile yollarını arıyorum. Bu etkili bir şekilde nasıl yapılacağı hakkında herhangi bir öneriniz var mı?

Edit: statik başlatma emri sorunu ÇÖZMEK için bazı iyi cevaplar alıyorum, ama bu gerçekten benim sorum bu değil. Bu sorun tabi olan nesneleri BULMAK için nasıl bilmek istiyorum. Evan cevabı en iyi şimdiye kadar bu konuda gibi görünüyor; valgrind kullanabileceğimizi sanmıyorum, ama benzer bir işlevi gerçekleştirebilecek bellek analiz araçları var. Bu çok küçük bir birlik oluşturmak için başlatma sırasını yanlış sadece sorunları yakalamak istiyorsunuz, ve sırayla her bir yapı ile değiştirebilirsiniz. Belki bu yakalamak istiyorsunuz statik analiz aracı var. Platform IBM XLC/C AİX üzerinde çalışan derleyici.

CEVAP
2 Aralık 2008, Salı


Başlatma sırası çözme:

Öncelikle bu sadece geçici bir çözüm çünkü sen genel değişkenler, çalıştığınız kurtulmak için ama yok olmadı daha zamanı (gidiyorsun onlardan kurtulmaya sonunda arn mi :-)

class A
{
    public:
        // Get the globale instance abc
        //
        static A& getInstance_abc()  // return reference.
        {
            static A instance_abc;
            return instance_abc;
        }
};

Bu ilk kullanımda başlatıldığını ve uygulama sonlandırıldığında yok edildiğini garanti eder.

Çok Sorun Dişli.

C 11 Bu iş parçacığı güvenli olmasını garanti ediyor. ama C 03 resmen statik işlevi nesnelerin inşaat iş parçacığı güvenli olduğunu garanti etmez. Yani teknik olarak bu getİnstance_XXX() yöntemi, önemli bir bölümü ile korunmalıdır. Parlak tarafında gcc her statik işlev nesne yalnızca bir kez bile konuları huzurunda başlatılmış olacağını garanti eder derleyici bir parçası olarak açık bir yama var.

Lütfen dikkat:
Çift kontrol kilitleme desen bir optimize kilitleme deneyin uzak kullanmayın. Bu C çalışmaz

Oluşturma Sorunları

Oluşturma kullanılmadan önce yaratılmış olduğunu garanti çünkü sorunları var.

Yıkım Sorunlar:

Yok edildikten sonra nesne erişmek için olası bir sorun vardır. Bu sadece başka bir global değişken yıkıcı global tarafından olmayan yerel bir statik değişken bahsediyorum () nesnesi olur.

Çözüm yıkım emri zorlamak emin olmalısınız.
İmha sırası, inşaat sırası tam tersi olduğunu unutmayın. Bu nedenle yıkıcı nesnesi, nesnenin tahrip edilmiş olduğunu garanti edemez gerekir. Bunu yapmak için sadece nesne arama nesne inşa edilmiştir önce tam olarak yapılmış olduğunu garanti gerekir.

class B
{
    public:
        static B& getInstance_Bglob;
        {
            static B instance_Bglob;
            return instance_Bglob;;
        }

        ~B()
        {
             A::getInstance_abc().doSomthing();
             // The object abc is accessed from the destructor.
             // Potential problem.
             // You must guarantee that abc is destroyed after this object.
             // To guarantee this you must make sure it is constructed first.
             // To do this just access the object from the constructor.
        }

        B()
        {
            A::getInstance_abc();
            // abc is now fully constructed.
            // This means it was constructed before this object.
            // This means it will be destroyed after this object.
            // This means it is safe to use from the destructor.
        }
};

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Hak5

    Hak5

    7 EYLÜL 2005
  • Trevor Eckhart

    Trevor Eckha

    19 Aralık 2009
  • Video Copilot

    Video Copilo

    21 EYLÜL 2006