C++ hat eine Option, um einen Nullzeiger zurückzugeben, anstatt eine Bad_alloc Ausnahme zu werfen, wenn eine Zuweisung fehlgeschlagen ist.Wie std :: make_shared und new (std :: nothrow) kombiniert werden
Foo * pf = new(std::nothrow) Foo(1, 2, 3);
(Ja, ich verstehe dies verhindert, dass nur die neue von einer bad_alloc werfen, es nicht zu werfen eine Ausnahme Foo Konstruktor verhindern.)
Wenn Sie einen freigegebenen Zeiger statt eines verwenden möchten roher Zeiger, sollte man generell make_shared verwenden, da es um die Zuweisung des Kontrollblocks schlau wird.
make_shared kapselt das neue ein, was es unmöglich macht (?), Die Nothrow-Version zu wählen. Es scheint also, du musst make_shared abbrechen und explizit new aufrufen.
std::shared_ptr<Foo> pf(new(std::nothrow) Foo(1, 2, 3));
Dadurch entfällt die Optimierung des Steuerblockes mit der Foo Zuweisung und die Steuerblockzuweisung könnte unabhängig von der Foo Zuordnung nicht, aber ich will nicht auf das konzentrieren. Nehmen wir an, der Steuerblock ist klein, so dass seine Zuweisung in der Praxis niemals fehlschlägt. Es ist das Versäumnis, Platz für den Foo zuzuweisen, der mich betrifft.
Gibt es eine Möglichkeit, den Vorteil einer einzigen Zuweisung von make_shared zu erhalten, während die Fähigkeit erhalten bleibt, einfach einen null-Zeiger anstelle einer bad_alloc-Ausnahme zu erhalten, wenn Speicherplatz für den Foo reserviert wird?
Sie müssen wahrscheinlich eine Kopie von 'make_shared' Code machen und es dann nach Bedarf ändern. –