Ich dachte, es ist sehr neugierig, wenn ich entdeckte, dass der Standard definiert std::unique_ptr
und std::shared_ptr
auf zwei völlig verschiedene Arten in Bezug auf eine Deleter, die der Zeiger besitzen kann. Hier ist die Erklärung von cppreference::unique_ptr und cppreference::shared_ptr:Deleter-Typ in unique_ptr vs shared_ptr
template<
class T,
class Deleter = std::default_delete<T>
> class unique_ptr;
template< class T > class shared_ptr;
Wie Sie die unique_ptr sehen „rettet“ die Art des dem Deleter-Objekt als Vorlage Argument. Dies kann auch in der Art, wie der Deleter aus dem Zeiger auf später abgerufen wird:
// 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);
Kann jemand die rationale hinter diesem Unterschied erklären? Ich favorisiere eindeutig das Konzept für unique_ptr
Warum wird dies nicht auf shared_ptr
aswell angewendet? Warum sollte get_deleter
im zweiten Fall eine Nichtmitgliedsfunktion sein?
Jemand muss den ursprünglichen Vorschlag ausgraben, aber meine Vermutungen: Nicht die Deleter als Vorlage Argument macht 'shared_ptr' einfacher zu bedienen, aber Sie müssen die Art löschen Kosten bezahlen. Wenn man "get_deleter" zu einem Mitglied macht, wird das Schreiben von generischem Code mit 'shared_ptr' mühsamer - man müsste 'sp.template get_deleter ()' anstelle von 'get_deleter (sp)' schreiben. Deshalb ist 'std :: get' ein Nichtmitglied. –
Expandiert etwas auf was @ T.C. sagte, eines der Entwurfsziele für 'unique_ptr' ist, dass es (fast) Null Overhead haben sollte. Das Löschen des Löschertyps ist praktisch, führt jedoch zu Laufzeit-Overhead aus dem Löschvorgang, daher ist es für 'unique_ptr' weniger geeignet als für' shared_ptr'. – wakjah
Sie sollten außerdem beachten, dass 'shared_ptr p = make_shared ()' ist macht das Richtige, auch wenn 'Base' keinen virtuellen Destruktor hat. [Beweis] (http://coliru.stacked-crooked.com/a/f3a50f90e00d4e58). –