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
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 delete
ing (default_delete
r). 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 şablonuunique_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.
Neden bu kod geçersiz bir işaretçi kul...
Neden çift işaretçi kullanın? ya da Ne...
Hangi sürümü Android uygulaması için k...
neden maven ile ilgileniyoruz 1.6 ama ...
İşaretçi ifadeleri:, * Ao **Ao Ao...