Qt
Domniemane udostępnianie
Szukaj…
Uwagi
Iteratory stylu STL na kontenerze Qt mogą mieć negatywne skutki uboczne z powodu niejawnego udostępniania. Zaleca się unikanie kopiowania kontenera Qt, gdy na nim są aktywne iteratory.
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!
Podstawowy pomysł
Kilka obiektów i kontenerów Qt korzysta z pojęcia nazywanego niejawnym udostępnianiem , które można również nazwać kopiowaniem przy zapisie .
Niejawne udostępnianie oznacza, że klasy korzystające z tej koncepcji dzielą te same dane podczas inicjalizacji.
Jedną z tych klas używających tej koncepcji jest QString.
QString s1("Hello World");
To jest uproszczony model QString. Wewnętrznie ma blok pamięci, z aktualnymi danymi łańcucha i licznikiem referencyjnym.
QString s2 = s1;
Jeśli teraz skopiujemy ten QString
oba obiekty będą wewnętrznie wskazywały tę samą treść, unikając w ten sposób niepotrzebnych operacji kopiowania. Zwróć uwagę, jak wzrosła liczba referencji. Dlatego w przypadku usunięcia pierwszego ciągu udostępnione dane nadal wiedzą, że odwołuje się do nich inny ciąg QString
.
s2 += " and all the other Worlds!"
Teraz, gdy QString
jest faktycznie modyfikowany, obiekt „odłącza się” od bloku pamięci, kopiując jego zawartość i modyfikując zawartość.