Sie müssen Sie sicherstellen, dass Sie beide Shared_ptr Objekte mit demselben Rohzeiger nicht initialisiert werden, oder es wird zweimal gelöscht werden. Ein besserer (aber immer noch schlecht) Weg, es zu tun:
classA* raw_ptr = new classA;
shared_ptr<classA> my_ptr(raw_ptr);
// or shared_ptr<classA> my_ptr = raw_ptr;
// ...
shared_ptr<classA> other_ptr(my_ptr);
// or shared_ptr<classA> other_ptr = my_ptr;
// WRONG: shared_ptr<classA> other_ptr(raw_ptr);
// ALSO WRONG: shared_ptr<classA> other_ptr = raw_ptr;
WARNUNG: der obige Code zeigt schlechte Praxis! raw_ptr
sollte einfach nicht als Variable existieren. Wenn Sie Ihre Smartpointer direkt mit dem Ergebnis new
initialisieren, reduzieren Sie das Risiko, dass andere Smartpointer versehentlich falsch initialisiert werden. Was Sie tun sollten, ist:
shared_ptr<classA> my_ptr(new classA);
shared_ptr<classA> other_ptr(my_ptr);
Was schön ist, dass der Code als auch prägnanter ist.
EDIT
ich wahrscheinlich darüber, wie es mit einer Karte funktionieren würde, erarbeiten sollte. Wenn Sie einen rohen Zeiger und zwei Karten hätten, könnten Sie etwas Ähnliches wie oben gezeigt machen.
unordered_map<string, shared_ptr<classA> > my_map;
unordered_map<string, shared_ptr<classA> > that_guys_map;
shared_ptr<classA> my_ptr(new classA);
my_map.insert(make_pair("oi", my_ptr));
that_guys_map.insert(make_pair("oi", my_ptr));
// or my_map["oi"].reset(my_ptr);
// or my_map["oi"] = my_ptr;
// so many choices!
Don; T den rohen Zeiger in einer Variablen aussetzen. Auf diese Weise geben Sie einem Betreuer eine einfachere Möglichkeit, den RAW-Zeiger in einen anderen gemeinsamen Zeiger zu stecken. Verwenden Sie einfach 'my_ptr (new ClassA());' Auf diese Weise muss ein Betreuer zusätzliche Arbeit leisten, um Dinge zu vermasseln. –
@Martin York Ich habe gerade editiert, um einen Punkt dazu hinzuzufügen; Ich werde eine explizitere Notiz hinzufügen. Aber du hast Recht. :) – Dawson
'// oder shared_ptr my_ptr = raw_ptr;' ist in 'std :: shared_ptr' falsch, weil es explizit als' // oder shared_ptr my_ptr (raw_ptr); 'sein sollte. –
Justme0