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");

Jedna inicjalizacja QString

To jest uproszczony model QString. Wewnętrznie ma blok pamięci, z aktualnymi danymi łańcucha i licznikiem referencyjnym.

QString s2 = s1;

skopiuj QString

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!"

Kopiuj przy zapisie

Teraz, gdy QString jest faktycznie modyfikowany, obiekt „odłącza się” od bloku pamięci, kopiując jego zawartość i modyfikując zawartość.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow