SORU
2 Ocak 2012, PAZARTESİ


Hangi tür işaretçi kullanın mı?

Tamam, bu yüzden bir yaşam, std::auto_ptr C yazdım son kez std lib mevcut yoktu, ve boost::shared_ptr tüm öfke oldu. Hiç diğer akıllı işaretçi türleri artışı sağladı içine baktı. C 11 şimdi boost ile geldi bu tür, ama hepsi değil bazı sağlar anlıyorum.

Yani birisi olan akıllı işaretçi kullanmak için zaman belirlemek için basit bir algoritma var mı? Tercihen danışmanlık aptal işaretçiler ile ilgili (T* gibi çiğ işaretçiler) de dahil olmak üzere ve destek aklınız işaretçiler. (this gibi bir şey iyi olurdu).

CEVAP
2 Ocak 2012, PAZARTESİ


Mülkiyet paylaştı:
Standart kabul edilen shared_ptr weak_ptr çok kendi gibi aynı Boost counterparts. Kaynak paylaşımı, gerektiğinde kullanmak için ve hayatta kalmak için son olacak bilmiyorum. weak_ptr ömrünü etkilemeden paylaşılan kaynak gözlemlemek, döngüleri kırmak için değil kullanın. shared_ptr ile devir normalde olmaması gereken iki kaynak birbirine sahip olamaz.

Bu Destek ayrıca shared_ptr<std::vector<T> const> için uygun bir alternatif olabilir shared_array sunar dikkat edin.

Sonraki, Boost kaynak referans sayılan yönetim zaten sunuyor ve DEMİRYOLU ilkesini benimsemek istiyorsan basit bir çözüm olan intrusive_ptr sunuyor. Bu standart tarafından kabul edildi.

Benzersiz sahipliği:
Güçlendirme için bir deleter belirtebilirsiniz olmayan copyable olmayan scoped_ptr, ve vardır. std::unique_ptr steroid boost::scoped_ptr ve olmalıdırakıllı bir işaretçi ihtiyacınız olduğunda seçim varsayılan. Şablon bağımsız değişkenleri bir deleter belirlemenizi sağlarhareketli, boost::scoped_ptr aksine. Copyable türleri (tabii ki) bu da STL kapları tam olarak kullanılabilir işlemleri kullanmadığınız sürece.

Not tekrar Destek olan bir dizi scoped_array, standart Birleşik gerektiren tarafından std::unique_ptr<T[]> kısmi uzmanlaşma olacak delete[] işaretçi yerine deleteing (default_deleter). std::unique_ptr<T[]> operator[] yerine operator* operator-> teklifler.

std::auto_ptr hala standart olduğunu, ancak unutmayınkaldırılmış. §D.10 [depr.auto.ptr]

Şablon auto_ptr sınıf önerilmiyor. [Not:Sınıf şablonu unique_ptr (20.7.1) daha iyi bir çözüm sağlar.—son not]

Hiçbir mülkiyet:
İçin aptal işaretçiler (ham pointers) veya referanslar kullanınolmayan sahibi başvuruyorbu . bildiğin kaynaklara ve ^strong>kaynak daha uzun ömürlü olacakbaşvuru / kapsam nesne. Başvurular tercih ve null veya resettability ya ihtiyacınız olduğunda ham işaretçi kullanın.

İsterseniz olmayan bir başvuru sahibi için bir kaynak, ama farkında değilsin eğer kaynak olacak daha uzun ömürlü nesne başvuran, pack kaynak shared_ptr a weak_ptr - test edebilirsiniz eğer üst shared_ptr Canlı lock, hangi olacak dönüş shared_ptr Bu non-null kaynağı hala var. Eğer kaynak ölü olup olmadığını test etmek istiyorsanız, expired kullanın. İki expired yalnızca tek bir deyim dönüş değeri teminat olarak benzer gelebilir, ama aynı anda yürütme karşısında çok farklıdır. Görünüşte masum bir test gibi

if(!wptr.expired())
  something_assuming_the_resource_is_still_alive();

olası bir yarış durumu.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alexis gillis

    alexis gilli

    23 HAZİRAN 2011
  • MikeyMacintosh

    MikeyM

    28 Aralık 2009
  • Santozz Yazz

    Santozz Yazz

    23 Mart 2014