Ist auto_ptr veraltet?


81
  1. Wird auto_ptr im eingehenden C ++ - Standard veraltet sein?
  2. Sollte unique_ptr anstelle von shared_ptr für die Eigentumsübertragung verwendet werden?
  3. Wenn unique_ptr nicht im Standard enthalten ist, muss ich stattdessen shared_ptr verwenden?

Antworten:


77

UPDATE: Diese Antwort wurde 2010 geschrieben und ist wie erwartet std::auto_ptrveraltet. Der Rat ist voll gültig.

In C ++ wird 0x std::auto_ptrzugunsten von veraltet std::unique_ptr. Die Wahl des intelligenten Zeigers hängt von Ihrem Anwendungsfall und Ihren Anforderungen ab. Die std::unique_ptrVerschiebungssemantik für Einzelbesitz kann in Containern verwendet werden (mithilfe der Verschiebungssemantik) und std::shared_ptrwenn der Besitz gemeinsam genutzt wird.

Sie sollten versuchen, den intelligenten Zeiger zu verwenden, der am besten zur Situation passt. Wenn Sie den richtigen Zeigertyp auswählen, erhalten andere Programmierer Einblick in Ihr Design.


22

Ja, ab heute auto_ptrist C ++ 0x veraltet und Sie sollten unique_ptrstattdessen verwenden. Aus dem neuesten Standardentwurf (n3035), Abschnitt D.9

Die Klassenvorlage auto_ptrist veraltet. [Hinweis: Die Klassenvorlage unique_ptr(20.9.10) bietet eine bessere Lösung. - Endnote]

Bis zur Ratifizierung des Standards ist es immer möglich, dass der Ausschuss diese Entscheidung revidiert, obwohl ich der Meinung bin, dass dies für diese Entscheidung unwahrscheinlich ist.


17

In C ++ 11 (D.10, Seite 1228) ist dies nicht nur auto_ptrveraltet , sondern wird auch in einer zukünftigen Version von C ++ gelöscht :

Angenommen N4190, und tatsächlich entfernt (nicht nur veraltet) mehr archaischen Dinge aus der C ++ Standard - Bibliothek, einschließlich auto_ptr, bind1st/ bind2nd, ptr_fun/ mem_fun/ mem_fun_ref, random_shuffleund ein paar mehr. Diese werden jetzt alle aus dem Entwurf der C ++ 17-Standardbibliothek entfernt und sind nicht Teil des zukünftigen portablen C ++.

Ein weiteres Dokument dazu: Programmiersprache C ++, Arbeitsgruppe Library Evolution - Dokument N4190 , wenn Sie weitere Informationen wünschen.

Sie können jeden Code auto_ptrautomatisch konvertieren , indem Sie unique_ptrstattdessen Folgendes verwenden:

Jeder verwendete Code auto_ptrkann mechanisch in "using " konvertiert werden unique_ptr, wobei er move()eingefügt wird, wenn auto_ptrer "kopiert" wurde.


3

Nein, es ist nicht veraltet. Es kann sein, dass C ++ 0x jemals akzeptiert wird. Und es wird realistisch immer unterstützt. Ich glaube nicht, dass veraltete Funktionen jemals aus realen C ++ - Implementierungen entfernt wurden.


5
Der C ++ - Standard wurde nur einmal aktualisiert, und das war im Grunde nur eine technische Berichtigung (dh die Behebung der genannten Probleme). Es ist nicht überraschend, dass es nichts entfernt hat. OTOH, alte Funktionen werden irgendwann von Compilern gelöscht. Nur zum Beispiel wird wahrscheinlich mehr C ++ verwendet <iostream.h>als jemals zuvor auto_ptr, aber MS VC ++ (zum einen) bietet es nicht mehr an.
Jerry Coffin

1
@ Jerry iostream.h war noch nie Teil eines Standards. Und als solches ist es nicht veraltet.

@Neil: Nein, aber es wurde viel benutzt . auto_ptrist Teil des Standards, wird aber wesentlich weniger verwendet. Aus praktischer Sicht wird die Entfernung drastisch weniger Auswirkungen haben.
Jerry Coffin

2
@ Jerry Nun, ich benutze viel auto_ptr und benutze iostream.h überhaupt nicht. Ich denke manchmal, dass das C ++ - Standardkomitee ein bisschen wie eine Biene in seiner kollektiven Haube ist, wenn es um Abwertung geht. Einige Dinge, wie die ursprünglichen String-Streams, waren offensichtlich falsch, andere, wie die Idee, namenlose Namespaces anstelle des perfekt verwendbaren "statischen" Schlüsselworts zu verwenden, waren (und sind) völlig verrückt.

1
@Neil: Nun, lass uns versuchen, es in die richtige Perspektive zu rücken. Unabhängig davon, was ich persönlich mache, denken Sie daran, dass eine Google-Suche nach "<iostream.h>" ~ 263'000 Treffer liefert und dasselbe wie auto_ptr ~ 66'000 Treffer ergibt.
Jerry Coffin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.