it-swarm.com.de

Warum ist es falsch, std :: auto_ptr <> mit Standardcontainern zu verwenden?

Warum ist es falsch, std::auto_ptr<> mit Standardbehältern?

205
Uhall

Der C++ - Standard besagt, dass ein AWL-Element "kopierkonstruierbar" und "zuweisbar" sein muss. Mit anderen Worten, ein Element muss zugewiesen oder kopiert werden können und die beiden Elemente müssen logisch unabhängig sein. std::auto_ptr erfüllt diese Anforderung nicht.

Nehmen Sie zum Beispiel diesen Code:

class X
{
};

std::vector<std::auto_ptr<X> > vecX;
vecX.Push_back(new X);

std::auto_ptr<X> pX = vecX[0];  // vecX[0] is assigned NULL.

Um diese Einschränkung zu überwinden, sollten Sie das std::unique_ptr , std::shared_ptr oder std::weak_ptr Smart Pointer oder die Boost-Entsprechungen, wenn Sie nicht über C++ 11 verfügen. Hier ist die Dokumentation zur Boost-Bibliothek für diese intelligenten Zeiger.

123
Kevin

Die Kopiersemantik von auto_ptr Sind nicht mit den Containern kompatibel.

Insbesondere beim Kopieren eines auto_ptr In ein anderes werden nicht zwei gleiche Objekte erstellt, da eines den Besitz des Zeigers verloren hat.

Insbesondere bewirkt das Kopieren eines auto_ptr, Dass eine der Kopien den Zeiger loslässt. Welche davon im Container verbleibt, ist nicht definiert. Daher können Sie den Zugriff auf Zeiger nach dem Zufallsprinzip verlieren, wenn Sie auto_ptrs In den Containern speichern.

65
Frank Krueger

Zwei super exzellente Artikel zum Thema:

38
Lazer

Die STL-Container müssen in der Lage sein, die in ihnen gespeicherten Elemente zu kopieren, und es muss erwartet werden, dass das Original und die Kopie gleichwertig sind. Auto-Pointer-Objekte haben einen ganz anderen Vertrag, wobei durch das Kopieren ein Eigentumsübergang entsteht. Dies bedeutet, dass Container mit auto_ptr je nach Verwendung ein seltsames Verhalten aufweisen.

In Effective STL (Scott Meyers) Punkt 8 und in Effective C++ (Scott Meyers) Punkt 13 finden Sie eine ausführliche Beschreibung dessen, was schief gehen kann.

17
Garth Gilmour

STL-Container speichern Kopien der enthaltenen Artikel. Wenn ein auto_ptr kopiert wird, wird der alte ptr auf null gesetzt. Viele Containermethoden sind von diesem Verhalten betroffen.

12
Dustin Getz

C++ 03 Standard (ISO-IEC 14882-2003) sagt in Abschnitt 20.4.5 Absatz 3:

[...] [ Hinweis: [...] auto_ptr erfüllt nicht die Anforderungen von CopyConstructible und Assignable für Containerelemente der Standardbibliothek. Das Instanziieren eines Containers der Standardbibliothek mit einem auto_ptr führt zu undefiniertem Verhalten. - Endnote]

Der C++ 11-Standard (ISO-IEC 14882-2011) sagt in Anhang D.10.1 Absatz 3:

[...] Hinweis: [...] Instanzen von auto_ptr erfüllen die Anforderungen von MoveConstructible und MoveAssignable, jedoch nicht die Anforderungen von CopyConstructible und CopyAssignable. - Endnote]

C++ 14 Standard (ISO-IEC 14882-2014) sagt in Anhang C.4.2 Anhang D: Kompatibilitätsmerkmale:

Change : Die Klassenvorlagen auto_ptr, unary_function und binary_function, die Funktionsvorlagen random_shuffle und die Funktionsvorlagen (und ihre Rückgabetypen) ptr_fun , mem_fun, mem_fun_ref, bind1st und bind2nd sind nicht definiert.
Begründung : Durch neue Funktionen ersetzt.
Auswirkung auf das ursprüngliche Merkmal : Gültiger C++ 2014-Code, der diese Klassenvorlagen und Funktionsvorlagen verwendet, kann möglicherweise in dieser Internationalen Norm nicht kompiliert werden .

4
bitek