C++'ta küresel ve statik nesneler, main() fonksiyonuna girmeden önce başlatılır. Ancak standart, farklı çeviri birimlerinde (derleme dosyaları, translation units) nesnelerin başlatma sırasını garanti etmez. Bu, bir küresel nesnenin diğerine atıfta bulunduğu ve onun henüz başlatılmadığı "statik başlatma sırası felaketi" gibi bir hataya yol açabilir.
Doğru başlatmayı garanti etmek ve bu sorunu önlemek için "ilk kullanımla başlatma" desenini kullanırız: bir statik yerel nesneye referans döndüren bir fonksiyon tanımlanır (C++11 ile ilk çağrıda iş parçacığı güvenli bir şekilde oluşturulur).
// foo.h class Config { public: int value; }; Config& getConfig() { static Config config; config.value = 42; // başlatma garanti edildi! return config; }
Eğer iki farklı .cpp dosyasında küresel nesneler birbirlerini oluşturursa, ne olur?
Cevap: Sonuç belirsizdir, başlatılmamış bir nesneye atıfta bulunulabilir. Çözüm, doğrudan küresel başlatmayı fonksiyon içindeki statik yerel nesne ile tembel başlatma ile değiştirmektir (yukarıya bakın).
Hikaye
Hikaye
Hikaye