Heim >Backend-Entwicklung >C++ >Warum erfordert das Schieben eines „unique_ptr' in einen „Vektor' „std::move'?
Den Fehler verstehen
Betrachten Sie das folgende Programm:
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); // Error occurs here }
Dieser scheinbar harmlose Code versucht, einen unique_ptr zu pushen in einen Vektor. Die Kompilierung schlägt jedoch mit einem Fehler fehl:
error: deleted function 'std::unique_ptr<int>::unique_ptr(const std::unique_ptr<int>&)'
Die Natur von unique_ptr
Der unique_ptr ist ein grundlegender Bestandteil der C-Standardbibliothek, der zur Verwaltung verwendet wird die Lebensdauer dynamisch zugewiesener Objekte. Es stellt sicher, dass der von ihm gekapselte Zeiger nicht kopiert werden kann. Dies bedeutet, dass der Besitz des verwalteten Objekts ausschließlich dem Container „unique_ptr“ gehört.
Das Problem
Der Fehler tritt auf, weil das Programm versucht, eine Kopie des unique_ptr hineinzuschieben der Vektor. Allerdings kann unique_ptrs, wie bereits erwähnt, nicht kopiert werden. Stattdessen können sie nur verschoben werden.
Lösung
Um das Problem zu beheben, müssen wir daher die Funktion std::move verwenden, um den Besitz des unique_ptr zu übertragen von der ursprünglichen Variablen zum Vektor. Der korrigierte Code sollte wie folgt aussehen:
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(std::move(ptr2x)); // Use std::move to transfer ownership }
Jetzt kann der Compiler das Programm erfolgreich kompilieren und ohne Fehler ausführen.
Zusätzliche Überlegungen
Es ist wichtig zu beachten, dass die Verwendung von unique_ptr im Code falsch ist. unique_ptr soll dynamisch zugewiesene Objekte verwalten. Der Zeiger im Code zeigt auf eine lokale Variable, die zerstört wird, wenn die Funktion zurückkehrt. Um dies zu beheben, sollte der Code das Objekt dynamisch zuordnen:
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; std::unique_ptr<int> ptr(new int(1)); // Dynamically allocate the object vec.push_back(std::move(ptr)); }
Alternativ können Sie die Funktion std::make_unique verwenden, um den unique_ptr zu erstellen und das Objekt in einer Zeile zuzuweisen:
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; vec.push_back(std::make_unique<int>(1)); }
Das obige ist der detaillierte Inhalt vonWarum erfordert das Schieben eines „unique_ptr' in einen „Vektor' „std::move'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!