Suche…


Bemerkungen

STL-Stil-Iteratoren für Qt-Container können aufgrund des impliziten Austauschs negative Auswirkungen haben. Es wird empfohlen, das Kopieren eines Qt-Containers zu vermeiden, wenn Iteratoren aktiv sind.

QVector<int> a,b; //2 vectors
a.resize(1000); 
b = a; // b and a now point to the same memory internally

auto iter = a.begin(); //iter also points to the same memory a and b do
a[4] = 1; //a creates a new copy and points to different memory.
//Warning 1: b and iter point sill to the same even if iter was "a.begin()"

b.clear(); //delete b-memory
//Warning 2: iter only holds a pointer to the memory but does not increase ref-count. 
//           so now the memory iter points to is invalid. UB!

Basiskonzept

Mehrere Qt-Objekte und -Behälter verwenden eine implizite gemeinsame Verwendung von Konzeptaufrufen, die auch als Copy-on-Write bezeichnet werden kann .

Implizite Freigabe bedeutet, dass die Klassen, die dieses Konzept verwenden, bei der Initialisierung dieselben Daten verwenden.

Eine dieser Klassen für die Verwendung des Konzepts ist QString.

QString s1("Hello World");

Eine QString-Initialisierung

Dies ist ein vereinfachtes Modell eines QStrings. Intern verfügt es über einen Speicherblock mit den eigentlichen String-Daten und einem Referenzzähler.

QString s2 = s1;

QString kopieren

Wenn wir nun diesen QString kopieren, QString beide Objekte intern auf den gleichen Inhalt, wodurch unnötige Kopiervorgänge vermieden werden. Beachten Sie, wie auch die Referenzzählung erhöht wurde. QString die erste Zeichenfolge gelöscht wird, wissen die gemeinsam genutzten Daten immer noch, dass sie von einem anderen QString .

s2 += " and all the other Worlds!"

Beim Schreiben kopieren

Wenn der QString tatsächlich geändert wird, "löst" sich das Objekt vom Speicherblock, kopiert seinen Inhalt und ändert den Inhalt.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow