Heim >Backend-Entwicklung >C++ >Warum kann ich eindeutige Zeiger nicht in einen Vektor „push_backen' und wie behebe ich das Problem?

Warum kann ich eindeutige Zeiger nicht in einen Vektor „push_backen' und wie behebe ich das Problem?

Susan Sarandon
Susan SarandonOriginal
2024-12-22 14:12:10129Durchsuche

Why Can't I `push_back` Unique Pointers into a Vector, and How Do I Fix It?

Vektor eindeutiger Hinweise: Warum push_back abgelehnt wurde und wie man es überwindet

In C stoßen wir auf einen Stolperstein, wenn wir versuchen, eindeutig zu speichern Zeiger in Vektoren. Vektorcontainer erwarten Elemente, die das Kopieren ermöglichen, während eindeutige Zeiger sich strikt an das Prinzip des eindeutigen Besitzes halten.

Beachten Sie den folgenden Ausschnitt:

std::vector<std::unique_ptr<int>> vec;

int x(1);
std::unique_ptr<int> ptr2x(&x);
vec.push_back(ptr2x); // Compiler error: attempt to copy unique pointer

Der Fehler ergibt sich aus dem Design des unique_ptr, um Exklusivität sicherzustellen Eigentum. Das Kopieren eines unique_ptr würde diese grundlegende Eigenschaft verletzen und seinen Kernzweck gefährden.

Verschieben, um das Dilemma zu lösen

Um dieses Problem zu lösen, müssen wir die Operation „Verschieben“ verwenden statt zu kopieren. Der Verschiebungsvorgang überträgt den Besitz von einem Container auf einen anderen und stellt so sicher, dass es nicht zu Duplikaten kommt.

vec.push_back(std::move(ptr2x));

Mit dieser Änderung fügt der Code den unique_ptr erfolgreich in den Vektor ein und behält seinen exklusiven Besitz bei.

Ein Warnhinweis

Es ist wichtig zu beachten, dass die Verwendung eines unique_ptr zum Verwalten eines Zeigers auf eine lokale Variable wie 'x' wird nicht empfohlen. Lokale Variablen werden beim Blockausgang automatisch behandelt (z. B. in diesem Fall Funktionsrückgabe). Stattdessen sollten Sie das Objekt dynamisch zuweisen.

std::unique_ptr<int> ptr(new int(1));

In C 14 können wir dies mit make_unique:

std::make_unique<int>(5);
weiter vereinfachen

Das obige ist der detaillierte Inhalt vonWarum kann ich eindeutige Zeiger nicht in einen Vektor „push_backen' und wie behebe ich das Problem?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn