SORU
20 ŞUBAT 2009, Cuma


akıllı işaretçiler (boost) açıkladı

İşaretçi aşağıdaki kümesi arasındaki fark nedir? Zaman hiç değilse üretim kodu, her işaretçi kullanın musunuz?

Örnekler mutluluk duyacağız!

  1. scoped_ptr

  2. shared_ptr

  3. weak_ptr

  4. intrusive_ptr

Edit#1

Üretim kodu boost kullanıyor musunuz?

CEVAP
20 ŞUBAT 2009, Cuma


Akıllı işaretçileri temel özellikleri

Her akıllı işaretçi atayabilirsiniz bu özellikler varsa çok kolay. Üç önemli özellikleri vardır.

  • hiçbir mülkiyet
  • mülkiyet devri
  • mülkiyet payı

İlk akıllı işaretçi olamaz Kendi değil, çünkü nesne silmek anlamına gelir. İkinci bir tek akıllı işaretçi hiç aynı anda aynı nesneye işaret anlamına gelir. Eğer akıllı işaretçi fonksiyonları döndürülecek ise, mülkiyeti iade akıllı işaretçi transfer, örneğin.

Üçüncü birden çok akıllı işaretçiler aynı anda aynı nesneye işaret anlamına gelir. Burası için de geçerlidirham işaretçiçok, ancak ham işaretçiler önemli bir özellik eksikliği olup olmadığını tanımlayınsahibiya da değil. Mülkiyet payı akıllı işaretçi, her dükkan sahibi nesne verirse nesneyi siler. Bu davranış, genellikle gerekli olur, paylaşılan sahip akıllı işaretçiler yaygın olarak yayılır.

Bazı akıllı işaretçiler sahibi ne ikinci ne de üçüncü destek. Bu nedenle işlevleri tarafından döndürülen veya başka bir yere aktarılabilir. Akıllı işaretçiyi yerel tutulduğu RAII amaçlar için en uygun ve kapsam dışına gider sonra bir nesne açığa çıkar böylece oluşturulur.

Mülkiyet payı yapıcı bir kopyasını alarak uygulanabilir. Bu da doğal olarak akıllı bir işaretçi kopyalar ve kopya ve orijinal, hem de aynı nesneyi referans alır. Transfer sahipliğini gerçekten uygulanmak C şu anda, çünkü orada hiçbir şekilde aktarmak bir şey bir nesne için başka bir tarafından desteklenen dil: Eğer deneyin bir nesneden bir işlevi, ne oluyor bu nesne kopyalanır. Mülkiyet değişimlerinde uygulayan akıllı bir işaretçi kopya kurucu sahipliğini bu transferi gerçekleştirmek için vardır. Ancak, bu da sonları kullanımı kaplar, çünkü gereksinimleri devlet belirli bir davranış kopya kurucu unsurları kaplar hangisi uyumsuz olan bu sözde "hareket eden yapıcı" bir davranış bu akıllı işaretçileri.

C 1x sözde tanıtarak-devri-mülkiyet desteği sağlar "kurucular" ve "atama operatörleri". yürü Ayrıca, transfer mülkiyet gibi akıllı bir işaretçi unique_ptr adlı ile birlikte geliyor.

Akıllı işaretçiler kategorize

scoped_ptr ne transfer ne de paylaşılabilir olduğundan akıllı bir işaretçi. Kapsam dışına çıktığında eğer yerel bellek gerekiyorsa kullanılabilir ama yine serbest olduğundan emin olun. Ama yine de başka bir eğer bunu yapmak istiyorsanız scoped_ptr ile takas olabilir.

shared_ptr mülkiyet (üçüncü tür yukarıda) paylaşan akıllı bir işaretçi. Bu son kopya kapsam dışına çıktığında görebilmesi referans sayılır ve sonra da nesne yönetilen açığa çıkar.

weak_ptr non-sahibi akıllı bir işaretçi. Başvuru sayısı eklemeden yönetilen bir nesne (bir shared_ptr tarafından yönetilen) başvurmak için kullanılır. Normalde shared_ptr dışında ham işaretçi almak gerekir ve etrafında anlaşıldı. Ama bu nesne gerçekten silindi zaman kontrol etmek için bir yol yok gibi güvenli olmaz. Yani, weak_ptr bir shared_ptr nesnesi tarafından yönetilen başvurarak anlamına gelir sağlar. Eğer nesneye erişmek için gerekiyorsa, yönetimi (nesne kullanırken başka bir iş parçacığı bir shared_ptr açığa çıkar bunu önlemek için) kilit ve kullanabilirsiniz. Eğer weak_ptr bir nesne zaten silinmiş işaret, bir istisna atarak dikkat edin. Weak_ptr döngüsel bir başvuru varsa en faydalı kullanma: Referans kolay böyle bir durumla baş edemez sayma.

intrusive_ptr gibi bir shared_ptr ancak yok kalsın başvuru sayısı bir shared_ptr ama yaprakları artırma/azaltma sayısı için bazı yardımcı işlevler gereken tarafından tanımlanan nesneye başardı. Bu avantajı bu zaten başvurulan nesne (olan başvuru sayısı artan bir dış referans sayma mekanizması) doldurulmuş içine bir intrusive_ptr - çünkü başvuru sayısı değil artık iç için akıllı işaretçi, ama akıllı işaretçi kullanır varolan referans sayma mekanizması.

unique_ptr mülkiyet değişimlerinde bir işaretçi. Dosyayı kopyalayamıyor, ama C 1x hareket kurucular kullanarak hareket edebilirsiniz:

unique_ptr<type> p(new type);
unique_ptr<type> q(p); // not legal!
unique_ptr<type> r(move(p)); // legal. p is now empty, but r owns the object
unique_ptr<type> s(function_returning_a_unique_ptr()); // legal!

Bu std olan semantik::auto_ptr itaat eder, ama hareket desteği eksik nedeniyle, tuzaklar olmadan bunları sağlamak için başarısız. unique_ptr otomatik olarak hareket semantiği önemli özelliklerinden biri olan geçici başka bir unique_ptr kaynakları çalacak. auto_ptr unique_ptr lehine gelecek C Standart sürümde kaldırılmış olacak. C 1x de tek hareketli ama kaplara copyable olmayan nesneleri doldurma izin verir. Örneğin bir vektör içine unique_ptr şeyler. Eğer bu konuda daha fazla okumak isterseniz burada durup bu konuda a fine article için başvuru yapacağım.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DominicFear

    DominicFear

    30 Kasım 2006
  • ipsy Makeup Tips

    ipsy Makeup

    19 ŞUBAT 2009
  • JorteexHD

    JorteexHD

    20 NİSAN 2012