Heim >Backend-Entwicklung >C++ >Warum kann ich in C einen eindeutigen Zeiger nicht direkt in einen Vektor verschieben?

Warum kann ich in C einen eindeutigen Zeiger nicht direkt in einen Vektor verschieben?

DDD
DDDOriginal
2024-12-29 02:35:09988Durchsuche

Why Can't I Directly Push a Unique Pointer into a Vector in C  ?

Das Problem verstehen: Eindeutige Zeiger in Vektoren einfügen

Der bereitgestellte Code versucht, einen eindeutigen Zeiger in einen Vektor zu schieben. Die Fehlermeldung gibt jedoch den Grund für den Kompilierungsfehler an:

error: deleted function 'std::unique_ptr<int>::unique_ptr(const std::unique_ptr<int>&)'

Dieser Fehler tritt auf, weil das Kopieren eindeutiger Zeiger nicht zulässig ist.

Die Natur eindeutiger Zeiger

Ein eindeutiger Zeiger legt, wie der Name schon sagt, den exklusiven Besitz eines dynamischen Speicherorts fest. Es garantiert, dass es nur einen eindeutigen Zeigercontainer gibt, der Eigentümer des gehaltenen Zeigers ist. Folglich wird das Erstellen einer Kopie eines eindeutigen Zeigers unzulässig. Das Kopieren würde dazu führen, dass zwei eindeutige Zeiger den Besitz desselben dynamischen Speichers beanspruchen, was gegen die inhärente Regel des eindeutigen Besitzes verstößt.

Wenn stattdessen der Besitz eines eindeutigen Zeigers auf einen anderen Container oder eine andere Funktion übertragen werden muss, erfolgt die Verschiebung Die Semantik von C kommt ins Spiel.

Lösung des Problems: Verwendung der Bewegungssemantik

Die Lösung für den Kompilierungsfehler und das Problem des Pushens Eindeutige Zeiger auf Vektoren basieren auf der Nutzung der Bewegungssemantik. Mit der std::move-Funktion implementierte Move-Semantik überträgt den Besitz des eindeutigen Zeigers, ohne eine Kopie zu erstellen.

In diesem Szenario wäre das korrigierte Code-Snippet:

int main()
{
    std::vector<std::unique_ptr<int>> vec;

    int x(1);
    std::unique_ptr<int> ptr2x(new int(x)); // Allocate the object dynamically
    vec.push_back(std::move(ptr2x)); // Transfer ownership with move semantics

    return 0;
}

Durch die Verwendung von std::move wird der Besitz von ptr2x auf vec übertragen und ptr2x verbleibt mit einem nullptr.

Das obige ist der detaillierte Inhalt vonWarum kann ich in C einen eindeutigen Zeiger nicht direkt in einen Vektor verschieben?. 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