2013-08-16 14 views
15

Was die gleichartigen Nutzungen jeden Smart-Pointer im Vergleich zu ähnlichen (aber nicht beschränkt auf) einigen fortgeschrittenen Techniken unter Verwendung von rohen Zeigern sind ?std :: unique_ptr vs std :: shared_ptr vs std :: weak_ptr vs std :: auto_ptr vs raw Zeigern

Mein Verständnis ist minimal, aber von dem, was ich sammeln:

  • Raw Pointers: Verwenden Sie nur, wenn Sie wirklich, wirklich, wirklich, wirklich wissen, was Sie tun und haben sorgfältig Nutzung hinter versteckt eine Schnittstelle.
  • std :: auto_ptr: Veraltet nie verwenden.
  • std :: unique_ptr: Singleton Zeiger, der Besitz auf Zuweisung überträgt.
  • std :: shared_ptr: Referenz gezählt Zeiger, nicht Besitz auf Zuweisung nicht übertragen, sondern erhöht seinen Referenzzähler. Wenn alle Referenzen verlassen Umfang oder explizit std::shared_ptr::reset die zugrunde liegenden deallocator genannt wird.
  • std :: weak_ptr: Ein Untertyp std::shared_ptr, der die Referenzzählung nicht inkrementiert und ungültig wird, wenn seine übergeordnete std::shared_ptr nicht mehr vorhanden ist. Kann zurückkehren und ungültige Referenz. Überprüfen Sie immer vor der Verwendung.

Rohzeiger GLEICHWERTIGEN Beispiele

Referenzzählung, Cache-Implementierungen:std::map<std::string, std::pair<long, BITMAP*> > _cache;

Singletons mit Übertragung des Eigentums:

class Keyboard { 
public: 
//... 
    static Keyboard* CreateKeyboard(); 
    ~Keyboard(); 
//... 
private: 
//... 
    Keyboard(); 
    static Keyboard* _instance; 
//... 
}; 

Aggregate Con tainer, kein eigentum: Spatial Partitionierung Graphen und Bäume, iterative Container, etc.

Composite-Container, Eigentum: Große Objekte.

--EDIT--

Wie ich arbeite ich auf einen interessanten Fall kam, wies darauf hin, dass DeadMG intelligente Zeiger sollen so einfach Abstraktionen verwendet werden Ressourcenmanagement zu kümmern; Was ist mit Dateibereichsobjekten, die zum Zeitpunkt der Deklaration nicht auf dem Heap erstellt werden können, sondern stattdessen zu einem späteren Zeitpunkt erstellt werden müssen?

+2

Ich verstehe nicht, was Sie fordern. Wie man intelligentes Zeigerverhalten mit rohen Zeigern implementiert? –

+1

Ich habe keine Ahnung, was diese Frage ist, aber wenn Sie 'unique_ptr' einen Singleton-Zeiger aufrufen, vermute ich, dass Sie hier eine ganz andere Bedeutung von Singleton haben. – Puppy

+0

@NeilKirk Das genaue Gegenteil, was sind die Verwendungen von Smartpointern im Vergleich zu rohen Pointern? d.h. welches Idiom soll jeder intelligente Zeiger ersetzen? – Casey

Antwort

4

Welches Idiom soll jeder Smart Pointer ersetzen?

Jeder einzelne von ihnen, der letztendlich dazu führte, dass die angegebene Ressource zerstört wurde. Mit anderen Worten, praktisch alle von ihnen. Ich kann mir keine Idiome mit rohen Zeigern vorstellen, bei denen es nicht darum ging, eine angegebene Ressource zu zerstören. Jeder andere Gebrauch ist nicht wirklich ein Idiom, es ist nur "Verwenden eines Zeigers".

+0

Aggregatcontainer zerstören ihre angegebenen Ressourcen nicht, sie entfernen sie nur aus einer Liste. Dies ist ein Hauptanliegen, das ich hatte, als ich intelligente Zeiger studierte, welcher intelligente Zeiger der wahrscheinliche Kandidat für solch eine Verwendung wäre? – Casey

+0

@Casey: Wenn sie ihre angegebenen Ressourcen nicht zerstören, warum sollten sie überhaupt einen intelligenten Zeiger verwenden? Intelligente Zeiger sind für das Zerstören von Dingen. – Puppy

+0

Okay, deshalb war ich verwirrt. Jede Person, die sich für intelligente Zeiger einsetzte, die ich gelesen hatte, lehnte vehement die Verwendung von rohen Zeigern in irgendeiner Form oder Mode ab und sollte durch einen intelligenten Zeiger ersetzt werden. – Casey