Qt
Implizite Freigabe
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");
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;
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!"
Wenn der QString
tatsächlich geändert wird, "löst" sich das Objekt vom Speicherblock, kopiert seinen Inhalt und ändert den Inhalt.