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'?

Jan 04, 2025 pm 07:28 PM

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
}
Nach dem Login kopieren

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>&)'
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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));
}
Nach dem Login kopieren

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));
}
Nach dem Login kopieren

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!

Erklärung dieser Website
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

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte Mar 03, 2025 pm 05:53 PM

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte

GULC: C -Bibliothek von Grund auf neu gebaut GULC: C -Bibliothek von Grund auf neu gebaut Mar 03, 2025 pm 05:46 PM

GULC: C -Bibliothek von Grund auf neu gebaut

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert? Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert? Mar 03, 2025 pm 05:52 PM

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert?

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)? Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)? Mar 12, 2025 pm 04:50 PM

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)?

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die? Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die? Mar 03, 2025 pm 05:53 PM

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die?

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher? Wo ist der Rückgabewert der C -Sprachfunktion im Speicher? Mar 03, 2025 pm 05:51 PM

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher?

eindeutiger Gebrauch und Phrasenfreigabe eindeutiger Gebrauch und Phrasenfreigabe Mar 03, 2025 pm 05:51 PM

eindeutiger Gebrauch und Phrasenfreigabe

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient? Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient? Mar 12, 2025 pm 04:52 PM

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient?

See all articles