Verschieben des Eigentums und Wiederverwenden von Containern in C
Wenn in C ein Objekt verschoben wird (mit der Funktion std::move), ist es Der Besitz wird auf die neue Variable übertragen. Dies bedeutet, dass die ursprüngliche Variable leer wird und keine gültigen Daten enthält.
Eine häufige Frage, die bei der Arbeit mit verschobenen Containern auftritt, ist, wie diese wiederverwendet werden können. Es stellt sich die Frage: „Wie kann ein verschobener Container richtig wiederverwendet werden?“
Den „Valid but Unspecified State“ verstehen
Gemäß dem C 0x-Standardentwurf , befindet sich ein Objekt nach dem Verschieben in einem „gültigen, aber nicht spezifizierten Zustand“. Dies bedeutet, dass das Objekt seine Invarianten erfüllt, die Konsistenz seines internen Zustands jedoch nicht gewährleistet ist.
Option 1: Nichts tun
Eine Option besteht darin, nichts zu tun und Gehen Sie davon aus, dass das Objekt noch gültig ist. Dieser Ansatz wird jedoch nicht empfohlen, da er zu undefiniertem Verhalten führen kann, wenn der interne Zustand des Containers nicht konsistent ist.
Option 2: „Zurücksetzen“ mit Löschen
Andere Die Option besteht darin, die Methode „clear“ zu verwenden, um den Container „zurückzusetzen“ und ihn leer zu machen. Dieser Ansatz stellt sicher, dass der interne Zustand des Containers konsistent ist und eine sichere Wiederverwendung ermöglicht.
Option 3: Mit Standardkonstruktor neu initialisieren
Eine letzte Option besteht darin, den einfach neu zu initialisieren Container mithilfe seines Standardkonstruktors. Dieser Ansatz stellt außerdem sicher, dass der interne Zustand des Containers konsistent ist und wieder verwendet werden kann.
Bevorzugter Ansatz
Der bevorzugte Ansatz für die Wiederverwendung eines verschobenen Containers ist die Verwendung der Clear-Methode . Dieser Ansatz ist sowohl sicher als auch effizient und vermeidet die potenziellen Fallstricke, die mit den anderen Optionen verbunden sind.
Beispiel
Bedenken Sie den folgenden Code:
std::vector<int> container; container.push_back(1); auto container2 = std::move(container); //container2.clear(); Reset container = std::vector<int>(); // Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2);
Durch die Verwendung der Clear-Methode zum Zurücksetzen von Container2 stellen wir sicher, dass sein interner Zustand konsistent ist und sicher wiederverwendet werden kann. Infolgedessen fügt der nachfolgende push_back-Vorgang korrekt ein neues Element zum Container hinzu.
Das obige ist der detaillierte Inhalt vonWie kann ich einen verschobenen Container in C sicher wiederverwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!