Standardın std::unique_ptr
ve std::shared_ptr
tanımlayıcısının işaretçinin sahip olabileceği bir Deleter ile ilgili iki farklı şekilde tanımladığını keşfettiğimde çok meraklı olduğunu düşündüm. İşte cppreference::unique_ptr ve cppreference::shared_ptr gelen beyanıdır:unique_ptr vs shared_ptr'de deleter tipi
template<
class T,
class Deleter = std::default_delete<T>
> class unique_ptr;
template< class T > class shared_ptr;
Eğer unique_ptr "kaydeder" Bir şablon argüman olarak Deleter-nesne tipi görebileceğiniz gibi.
// unique_ptr has a member function to retrieve the Deleter
template<
class T,
class Deleter = std::default_delete<T>
>
Deleter& unique_ptr<T, Deleter>::get_deleter();
// For shared_ptr this is not a member function
template<class Deleter, class T>
Deleter* get_deleter(const std::shared_ptr<T>& p);
birisi bu farkın arkasında rasyonel açıklayabilir: Bu aynı zamanda Deleter sonradan pointer alınır şekilde görülebilir? unique_ptr
konseptini açıkça destekledim, bu neden shared_ptr
için geçerli değil? Ayrıca, neden bu durumda get_deleter
üye olmayan bir işlev olur? İşte
Birisi orijinal önerisini kazıp zorunda, ama olacak benim eğitimli tahminler: şablon argümanı kullanmak daha kolay shared_ptr' 'yapar, ama sen tür silme masraflarını ödemeniz gerekiyor olarak deleter olmaması. Yapımı 'üyesi alarak jenerik kod yazarken yapacak get_deleter' bir' Shared_ptr 'daha sıkıcı - Eğer ()' yerine 'get_deleter (sp)' arasında 'sp.template get_deleter iletişim kurmanız gerekir. Bu yüzden std :: get' bir üye değildir. –
@ T.C'de hafifçe genişliyor. 'unique_ptr' için tasarım hedeflerinden biri de, (çok fazla) sıfır yüke sahip olması gerektiğidir. Silme Deleter tip ') (uygundur ama silinmekten zaman yükü çalıştırmak tanıtmaktadır, bu nedenle' – wakjah
Ayrıca çünkü farkı, 'Shared_ptr p = make_shared dikkat etmelidir shared_ptr' için daha unique_ptr'' az uygundur 'Base' sanal yok edici olmasa bile doğru olanı yapar. [Geçirmez] (http://coliru.stacked-crooked.com/a/f3a50f90e00d4e58). –