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!
scoped_ptr
shared_ptr
weak_ptr
intrusive_ptr
Edit#1
Üretim kodu boost kullanıyor musunuz?
CEVAP
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.
Sınıf üyeleri için kullanarak akıllı i...
C DEMİRYOLU ve akıllı işaretçiler ...
Boost.* Tabanlı HTTP istemci Kütüphane...
Nasıl işaretçiler işaretçi C çalışır?...
İki işaretçiler adresleri aynı...