ProgramlamaC++ geliştirici

C++'de 'Singleton' tasarım kalıbı nedir? Doğru nasıl uygulanır ve temel tuzaklar nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Konuya Giriş:

Singleton tasarım kalıbı, belirli bir sınıfın yalnızca bir örneğinin oluşturulmasını sınırlamak için önerilmiştir, bu durum küresel yöneticilerin (örneğin, günlük kaydedicilerin, kaynak havuzlarının, yapılandırıcıların) uygulanmasında talep edilmiştir.

Problem:

Singleton'ı uygulamak basit görünebilir, ancak C++'da zorluklar ortaya çıkar: çoklu iş parçacığı güvenliği, yok etmenin doğruluğu, başlatma sırası.

Çözüm:

Singleton'ı uygulamanın en güvenli ve modern yolu, bir statik fonksiyon içinde statik yerel bir değişken kullanmaktır, bu da ilk çağrıda yapılandırmayı garanti eder, çoklu iş parçacığı güvenliği (C++11'den itibaren) sağlar ve doğru yok edilmesini garanti eder.

Kod örneği:

class Singleton { public: static Singleton& instance() { static Singleton s; return s; } void doSomething() {} private: Singleton() {} Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; };

Ana özellikler:

  • Sınıfın yalnızca bir örneğinin varlığını garanti eder.
  • Tembel nesne yaratma ve çoklu iş parçacığı güvenliği (C++11'den itibaren).
  • Örneklerin yaşam süresi ve yok edilmesi üzerinde kontrol.

Tuzağa Düşüren Sorular.

Sıralama veya kopyalama ile ikinci bir Singleton örneği yaratılabilir mi?

Evet. Sıralama/yeniden sıralama yöntemleri uygulanırsa veya clone() yöntemini manuel olarak uygularsanız, kopyalama yapıcı sınırlaması yoksa, ikinci bir örnek ortaya çıkabilir. Bunu önlemek için tüm kopyalama, kopyalama ve sıralama yollarını yasaklamak gereklidir.

C++98/03 standardında, yerel statik bir değişken aracılığıyla çoklu iş parçacığı ortamında Singleton düzgün uygulanır mı?

Hayır. C++11'den önce, yerel statik değişkenler başlatma sırasında çoklu iş parçacığı güvenliğini garanti etmemiştir. Bu, iki iş parçacığı aynı anda instance() fonksiyonuna girdiğinde birden fazla örneğin oluşturulmasına yol açabilir. C++11 ve sonrası – sorun standart düzeyinde çözüldü.

Statik yerel bir değişken aracılığıyla oluşturulan Singleton örneği ne zaman yok edilir?

Nesne, kurulum sırasının tersine (LIFO) programın sonlanması aşamasında yok edilir (exit). Ancak, yok edicinin, zaten yok edilmiş nesnelere erişmesi durumunda sorunlara yol açabilir.

Yaygın Hatalar ve Antipatternler

  • Statik değişkenler yerine new kullanmak, bellek sızıntılarına neden olur.
  • Kopyalama/ataş yapmayı yasaklamaz.
  • İş parçacıkları dikkate alınmamıştır (eski standartlarda).
  • Singleton örneğini saklamak için shared_ptr veya weak_ptr kullanmak (eşsizlik ihlali).

Gerçek Hayattan Örnek

Olumsuz Durum

Günlük kaydı sisteminde geliştirici, küresel bir işaretçi ve new kullanarak Singleton'ı uygular, kopyalamayı yasaklamayı unutur. Program çalışır, ancak çoklu iş parçacığı ortamında bazen farklı günlük kaydedici örnekleri oluşur, mesajlar kaybolur.

Artılar:

  • En basit uygulama; tek iş parçacıklı modda hızlı çalışır.

Eksiler:

  • Potansiyel bellek sızıntıları.
  • İş parçacıklarında örneğin eşsizlik ihlali.
  • Yok etme ile ilgili sorunlar.

Olumlu Durum

Singleton, statik bir yerel değişken aracılığıyla statik bir fonksiyonda uygulanmıştır, kopyalama yasaklanmıştır. Çoklu iş parçacığı güvenliği sağlanmış, program ölçeklenebilir hale gelmiş, günlükler doğru bir şekilde ayrılmıştır.

Artılar:

  • Her durumda eşsizlik garantisi.
  • Doğru yok etme.
  • Bellek sızıntısı yok.