Heim >Backend-Entwicklung >C++ >Warum erfordert das Schieben eines „unique_ptr' in einen „Vektor' „std::move'?

Warum erfordert das Schieben eines „unique_ptr' in einen „Vektor' „std::move'?

DDD
DDDOriginal
2025-01-04 19:28:44717Durchsuche

Why does pushing a `unique_ptr` into a `vector` require `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!

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