Ich habe ein Projekt, das ich mehr Smart-Pointer verwenden möchte. Insgesamt war ich bei diesem Ziel erfolgreich. Ich bin jedoch auf einige Dinge gestoßen, bei denen ich nicht sicher bin, was die "beste Praxis" ist.Zurückgeben eines "Pointers", der von einem Smart Pointer gehalten werden muss
Grundsätzlich möchte ich einen "Zeiger" von einer Funktion zurückgeben, aber erfordern, dass der Benutzer es in einem Smart-Zeiger halten. Nicht nur das, ich möchte keinen bestimmten Smart Pointer (Shared vs. Scoped) vorschreiben.
Das Problem ist meistens, dass es scheint nicht zu einem richtigen Weg, um ein scoped_ptr
zu einem shared_ptr
zu aktualisieren (das wäre die ideale Lösung, die ich denke). Ich verstehe, warum sie dies nicht getan haben, da es die Übertragung von Eigentumsrechten erlauben würde, die zu einigen Problemen führen können, wie diese std::auto_ptr
hat.
Übertragung scheint jedoch eine gute Idee für dieser Fall. So ist meine Idee so:
// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }
Dies funktioniert „ok“, da beide scoped_ptr
und shared_ptr
Konstrukteure haben, die von einem std::auto_ptr
Besitz nehmen.
Also meine Frage ist, ist das gute Praxis? Gibt es eine bessere Lösung? Die einzige wirkliche Alternative, die ich habe in der Lage gewesen, mit zu kommen ist eine Vorlage Vorlage als Rückgabewert wie folgt aus:
// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }
die könnte tatsächlich gut funktionieren, außer, dass ich denke, es ist etwas Arbeit benötigen würde, um es zu arbeite mit einem scoped_ptr
auch.
Gedanken?
shared_ptr in der einzelnen Thread-Erstellung verwendet keine atomare Referenzzählung. –
Sie haben Recht, aber standardmäßig Boost ist in Multi-Thread-Version gebaut. – Artyom
Der Vorteil der Verwendung von scoped_ptr gegenüber auto_ptr ist, wenn Sie deutlich machen wollen, dass Sie den Zeiger nicht kopieren sollen. Das geht mit scoped_ptr einfach nicht. Es geht darum, Ihre Absichten zu vermitteln, genau wie in Ihrem Beispiel mit auto_ptr und Eigentumsübertragung. –