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 vector
veya anlam semantiği kullanan diğer veri yapılarına ve unique_ptr
tek 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_ptr
hakkı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_ptr
mülkiyeti paylaşılması gereken tahsis edilmiş nesneler için makul bir yaşam kalitesi sağlamalıdır.
Sonra, weak_ptr
a 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_ptr
geliyor Ben durumlar olmuştur. Olabilirdi bir kullanmış unique_ptr
Or 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_ptr
mi? 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_ptr
Ayrıca geri dönmek , birisinin basitçe saklamasını ve nesnenin ömrünü uzatmasını çok kolaylaştırır. weak_ptr
Bununla birlikte, geri döndüğünüzden emin shared_ptr
olmanı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_ptr
doğal olanı yapmaktan minimum direnç sağlar.
Şimdi, bu fazla kullanılamaz demek shared_ptr
değ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_ptr
boost::shared_ptr
unique_ptr
boost::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.