2013-03-18 9 views
23

Was sind die empfohlenen Verwendungen von std::unique_ptr wo genau, wann und wie wird es am besten verwendet?Empfohlene Verwendung von std :: unique_ptr

ich entdeckt:

About unique_ptr performances

Ich weiß schon:

  1. std::unique_ptr wurde C++ 11 entwickelt als Ersatz in für std::auto_ptr
  2. Dass ein std::unique_ptr keine Referenzzählung hat und "besitzt" -Objekt zeigt auf
  3. Es gibt keine Kopie/a ssign mit einem std::unique_ptr
  4. Wenn ich einen eindeutigen Zeiger benötigen, ist std::unique_ptr die Go

zu strukturieren Was würde ich gerne wissen:

  1. wird mit einem std::unique_ptr immer vorzuziehen (außer Einzigartigkeit) zu etwas
    sonst noch? Was bekomme ich in dieser Situation?
  2. Wenn ja, unter welchen Umständen und wann?
  3. Angesichts der Notwendigkeit für Bewegung Semantik, würde dies eine std::unique_ptr weniger günstige
    insgesamt machen?
  4. Wenn ein std::shared_ptr für dynamische Speicherverwaltung genügen würde in fast jeder Situation , warum mir zur Verfügung hat, die eine std::unique_ptr Materie (wieder andere
    als Einzigartigkeit)?
+2

Da der Typ 'unique_ptr' genannt wird, finde ich es komisch, dass Sie nach einer anderen Verwendung suchen, als einzigartig zu sein ... –

+2

Und [Welche Art von Zeiger verwende ich wann?] (Http://stackoverflow.com/q/8706192/256138) – rubenvb

+1

@Mushy: Die Hauptfrage, die Sie beantworten müssen, ist die des Eigentums. Bei der Auswahl eines intelligenten Zeigers spielt nichts anderes eine Rolle, und das wird in den Fragen, auf die ich verlinkte, sehr gut beantwortet. Die Frage, die du verlinkt hast, hatte meinen Downvote (von früher), weil er nichts definitives zeigt und die falsche Frage nach den "Daten" stellt. – rubenvb

Antwort

7

In der Theorie sollten Sie unique_ptr für alle Zeiger verwenden, wenn Sie wissen, dass Sie es teilen, in diesem Fall Sie shared_ptr verwenden sollten. Der Grund dafür ist, dass unique_ptr weniger Overhead hat, da Referenzen nicht gezählt werden.

jedoch ein unique_ptr beweglich ist, aber nicht kopierbar, so dass man als Member-Variable verwenden, können Sie benötigen mehr Code zu schreiben (zB ein Umzug Konstruktor), bedeutet einen nach dem Wert vorbei Sie std::move und so weiter verwenden müssen . Als Folge verwenden einige Leute shared_ptr aus Faulheit, weil es einfach einfacher ist, und der Perf-Unterschied möglicherweise nicht signifikant für ihre App ist.

Endlich ist ein roher Zeiger für Beobachtungszeiger in Ordnung, der die Lebensdauer niemals beeinflussen kann. Eine sorgfältige Auswahl des richtigen Zeigertyps kann denjenigen, die Ihren Code gelesen haben, ein gutes Verständnis dessen geben, was Sie tun. Weitere Informationen finden Sie in Herb Sutters Aufsatz Elements of C++ Style, speziell im Abschnitt "no delete".

+1

'= default' und implizite move-Mitglieder können sich einfach um den zusätzlichen Code kümmern. – Puppy

+0

Wenn Sie vor dem Hinzufügen eines 'unique_ptr' keinen expliziten move-Konstruktor benötigen, brauchen Sie danach keinen expliziten move-Konstruktor. Die einzige Situation, in der Sie mehr Code schreiben müssten, wäre, wenn Sie etwas getan hätten, das den impliziten Move-Konstruktor deaktiviert. – Cubic

+0

@DeadMG Ich warte immer noch = Standard in meinem Compiler, aber ja –