Bjarne'nin yaşadığı dünya ... daha iyi bir terim istemek için çok akademik. Kodunuz, nesnelerin çok kasıtlı ilişkisel hiyerarşilere sahip olacak şekilde tasarlanıp yapılandırılabilirse, sahiplik ilişkileri katı ve boyun eğmeyecek şekilde düzenlenirse, kod tek bir yönde akar (yüksek seviyeden düşük seviyeye) Hiyerarşi, o zaman fazla ihtiyaç bulamazsınız shared_ptr. Birisinin kuralları çiğnemek zorunda olduğu nadir durumlarda kullandığınız bir şey. Ancak, aksi takdirde, her şeyi yalnızca vectorveya anlam semantiği kullanan diğer veri yapılarına ve unique_ptrtek olarak ayırmanız gereken şeyler için yapıştırabilirsiniz .
Yaşamak için harika bir dünya olsa da, her zaman yapacakların bu değil. Eğer varsa edemez yapmak için çalışıyoruz sisteminin tasarımı imkansız (veya sadece derin tatsız) olduğu anlamına gelir, çünkü bu şekilde kodunuzu düzenlemek, o zaman kendinizi daha nesnelerin ortak sahipliğini ihtiyacı bulacaklardır .
Böyle bir sistemde, çıplak işaretçiler tutmak ... tam olarak tehlikeli değildir, ancak soruları da beraberinde getirir. Bunun en iyi yanı , nesnenin ömrü shared_ptrhakkında makul sözdizimsel garantiler sağlamasıdır. Kırılabilir mi? Tabii ki. Ancak insanlar da bir const_castşeyler yapabilir ; Temel bakım ve beslenme, shared_ptrmülkiyeti paylaşılması gereken tahsis edilmiş nesneler için makul bir yaşam kalitesi sağlamalıdır.
Sonra, weak_ptra yokluğunda kullanılamaz s vardır shared_ptr. Sisteminiz katı bir şekilde yapılandırılmışsa, bir uygulamanın yapısının işaret ettiği nesnenin sizi geride bırakmasını sağladığından emin olarak, bir nesneye çıplak bir işaretçi koyabilirsiniz. İşaretçiyi bazı iç veya dış değerlere döndüren bir işlevi çağırabilirsiniz (örneğin, X isimli nesneyi bulun). Düzgün bir şekilde yapılandırılmış kodda, bu işlev yalnızca nesnenin kullanım ömrünü kendinizin geçeceği garantilenmişse kullanılabilir olacaktır; bu nedenle, bu çıplak imleci nesnenizde saklamak iyidir.
Bu rijitlik gerçek sistemlerde her zaman elde edilemeyeceğinden , kullanım ömrünü makul şekilde güvence altına almak için bir yol gerekir . Bazen tam mülkiyete ihtiyaç duymazsınız; bazen, işaretçinin ne zaman kötü veya iyi olduğunu bilmeniz gerekir. İşte bu noktada weak_ptrgeliyor Ben durumlar olmuştur. Olabilirdi bir kullanmış unique_ptrOr boost::scoped_ptr, ama kullanmak zorunda kaldı shared_ptrçünkü özellikle birilerine "uçucu" işaretçi vermek gerekiyordu. Ömrü belli olan bir işaretçi belirsizdi ve bu işaretçi imha edildiğinde sorgu yapabilirlerdi.
Dünyadaki devlet belirsiz olduğunda hayatta kalmak için güvenli bir yol.
Bu, işaretçiyi almak yerine, işlev çağrısı tarafından yapılmış olabilir weak_ptrmi? Evet, ama bu daha kolay kırılabilir. Çıplak bir işaretçiyi döndüren bir fonksiyonun, söz konusu işaretçiyi uzun süreli saklamak gibi bir şey yapmamasını öneren sözdizimi açısından hiçbir yolu yoktur. shared_ptrAyrıca geri dönmek , birisinin basitçe saklamasını ve nesnenin ömrünü uzatmasını çok kolaylaştırır. weak_ptrBununla birlikte, geri döndüğünüzden emin shared_ptrolmanız sizi depolamanın lockşüpheli bir fikir olduğunu gösteriyor. Bunu yapmaktan alıkoyamaz, ama C ++ 'da hiçbir şey kodları kırmanızı engellemez. weak_ptrdoğal olanı yapmaktan minimum direnç sağlar.
Şimdi, bu fazla kullanılamaz demek shared_ptrdeğil ; kesinlikle yapabilir. Özellikle de, önceden kullandığım birçok durum vardı çünkü bir RAII işaretçisini etrafa geçirmem ya da listeye koymam gerekti. Ve hareket semantik olmadan , tek gerçek çözüm oldu.unique_ptrboost::shared_ptrunique_ptrboost::shared_ptr
Ve gereksiz olduğu yerlerde kullanabilirsiniz. Yukarıda belirtildiği gibi, uygun kod yapısı bazı kullanımlara duyulan ihtiyacı ortadan kaldırabilir shared_ptr. Ancak sisteminiz bu şekilde yapılandırılamıyorsa ve hala ne gerekiyorsa yapıyorsa shared_ptr, önemli bir kullanım alanı olacaktır.