Heim >Backend-Entwicklung >C++ >Warum kann ich eindeutige Zeiger nicht in einen Vektor „push_backen' und wie behebe ich das Problem?
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!