2011-01-12 12 views
29

Ich habe einen Zeiger auf ein Objekt. Ich möchte es in zwei Behältern aufbewahren, die beide das Eigentum haben. Also ich denke, ich wäre gut, es zu einem shared_ptr von C++ 0x zu machen. Wie kann ich einen rohen Zeiger in einen shared_pointer konvertieren?Erstellen shared_ptr von rohen Zeiger

typedef unordered_map<string, shared_ptr<classA>>MAP1; 
MAP1 map1; 
classA* obj = new classA(); 
map1[ID] = how could I store obj in map1?? 

Dank

Antwort

28

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! 
+2

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. –

+0

@Martin York Ich habe gerade editiert, um einen Punkt dazu hinzuzufügen; Ich werde eine explizitere Notiz hinzufügen. Aber du hast Recht. :) – Dawson

+0

'// 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

3

Sie können eine Vielzahl von Möglichkeiten, aber reset() wäre gut:

map1[ID].reset(obj); 

Und das Problem der mit zwei Karten auf den gleichen Shared_ptr beziehen zu adressieren, können wir haben:

Beachten Sie, dass der Trick im Allgemeinen, um ein doppeltes Löschen zu vermeiden, ist zu versuchen, rohe Zeiger überhaupt zu vermeiden. Daher vermeiden:

classA* obj = new classA(); 
map1[ID].reset(obj); 

sondern setzten das neue Heap-Objekt direkt in ein shared_ptr.

+0

es ist keine schlechte Übung per se, es ist c-Praxis! – g24l

Verwandte Themen