War Raw-Pointer-Konstruktor von shared_ptr ein Fehler?

Im Nachhinein gegebenmake_shared, würdeshared_ptr Haben Sie einen Konstruktor, der einen rohen Zeiger verwendet? Wurde er mit C ++ 11 eingeführt?

Gibt es starke Argumente oder Use Cases für diesen Konstruktor?

Es hätte die gut dokumentierte Falle von @ vermied ausnahmesicherheit und dieSpeicherzuordnung / Leistungsvorteil vom Benutzenmake_shared.

ch glaube, ein weiterer Vorteil der Anforderung vonshared_ptr Konstruktion übermake_shared wäre, dass es sich um einen einzelnen Zeiger unter der Haube handeln könnte, der die Speichernutzung senkt und Dinge wie @ erzeug atomic_compare_exchange viel einfacher (und möglicherweise effizienter). (sehenPräsentation von C ++ Now)

BEARBEITE

Ich verstehe, dass ein shared_ptr, der im Grunde ein intrusive_ptr ist (wobei das Objekt und der Steuerblock zusammengeführt sind), keine Funktionen hat, über die der aktuelle std :: shared_ptr verfügt. Mögen

die Fähigkeit, das Objekt getrennt vom Steuerblock freizugeben (was schön ist, wenn Sie schon lange weak_ptrs gelebt haben)

Kompatibilität mit Bibliotheken, die Ihnen unformatierte Zeiger zur Verfügung stellen, und die Verantwortung, sie freizugeben

die Fähigkeit, beliebige Ressourcen mit benutzerdefinierten Löschfunktionen zu speichern (oder keine Löschfunktion, wenn Sie keine Zeiger besitzen)

die Fähigkeit, auf ein Unterobjekt (z. B. ein Mitglied) zu zeigen, während das übergeordnete Objekt am Leben bleibt.

Was ich vorschlage, ist, dass diese Funktionen möglicherweise nicht häufig genug verwendet werden (oder im Fall der Verwendung als Hawaii-Wrapper), möglicherweise nicht die beste Lösung sind, um die zusätzlichen Kosten zu rechtfertigen:

ein separater Zeiger auf den Steuerblock (möglicherweise) komplexere atomic_compare_exchange-Logik, kann es nicht wert sein.

In einer C ++ 98-Welt (in der shared_ptr eingeführt wurde) ist make_shared weniger praktisch und weniger benutzerfreundlich (das Fehlen einer perfekten Weiterleitung erfordert Referenz-Wrapper und das Fehlen verschiedener Vorlagen macht die Implementierung schwierig).

Antworten auf die Frage(6)

Ihre Antwort auf die Frage