Übergeben freigegebener Zeiger als Argumente

Wenn ich das deklarieren eines Objekts, eingewickelt in ein shared pointer:

std::shared_ptr<myClass> myClassObject(new myClass());

dann wollte ich mich übergeben Sie Sie als argument an eine Methode:

DoSomething(myClassObject);

//the called method
void DoSomething(std::shared_ptr<myClass> arg1)
{
   arg1->someField = 4;
}

Hat die oben erhöhen Sie einfach die shared_pt Verweiszähler und alles ist cool? Oder hinterlässt es ein dangling pointer?

Sind Sie immer noch, dies zu tun?:

DoSomething(myClassObject.Get());

void DoSomething(std::shared_ptr<myClass>* arg1)
{
   (*arg1)->someField = 4;
}

Ich denke, dass der 2. Weg ist effizienter, da es nur 1 Kopie-Adresse (im Gegensatz zu den ganzen smart-pointer), aber der 1. Weg scheint mehr lesbar und ich weiß nicht antizipieren schieben Leistungsgrenzen. Ich will einfach nur, um sicherzustellen, dass es ist nicht etwas, was gefährlich ist.

Danke.

Kommentar zu dem Problem
const std::shared_ptr<myClass>& arg1 Kommentarautor: Captain Obvlious
Die zweite Möglichkeit ist gebrochen, der erste ist idiomatisch, wenn Sie wirklich brauchen, Ihre Funktion zu Eigentum zu teilen. Aber, DoSomething wirklich brauchen, um Eigentum zu teilen? Es sieht aus wie es sollte nur einen Verweis anstelle... Kommentarautor: ildjarn
@SteveH : Es muss nicht, aber warum sollte die Funktion force special object ownership Semantik auf seine Anrufer, wenn Sie nicht tatsächlich benötigen? Ihrer Funktion tut nichts, was nicht besser wäre, als void DoSomething(myClass& arg1). Kommentarautor: ildjarn
@SteveH : Der gesamte Zweck von smart pointers zu handhaben out of the ordinary-Objekt Eigentumsrecht-Probleme -- wenn Sie nicht über diese, Sie sollten nicht mithilfe der smart-Pointer in den ersten Platz. ;-] Als shared_ptr<> insbesondere muss als Wert übergeben, um tatsächlich das Eigentum zu teilen. Kommentarautor: ildjarn
Unrelated: in general, , std::make_shared ist nicht nur effizienter, sondern auch sicherer als die std::shared_ptr Konstruktor. Kommentarautor: R. Martinho Fernandes

InformationsquelleAutor der Frage Steve H | 2012-05-31

Schreibe einen Kommentar